Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите идею: computed column  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Есть таблица, в ней поля

deleted int
deletion_date datetime
deleted_expired AS (case when datediff(day,[deletion_date],getdate())>(7) AND [deleted]<>(0) then (1) else (0) end)


То есть - при удалении записи юзером реально запись апдейтится

update t set deleted+=1, deletion_date=getdate()


Затем в бэкграунде (типа Job) выполняется удаление кусками записей, у которых deleted_expired<>0

Всё бы хорошо, но что если юзер захочет иметь период на протухание не 7 дней, а 3 или 33?

В этом случае я делаю так:

ALTER TABLE dbo.t
DROP COLUMN deleted_expired

ALTER TABLE dbo.t
ADD deleted_expired AS (case when datediff(day,[deletion_date],getdate())>(7) AND [deleted]<>(0) then (1) else (0) end)


Но как-то некомфортно удалять и добавлять поле в режиме изменения настроек юзером.

Возможны другие подходы к самой идее или к изменению параметра "количество дней"?
10 сен 15, 19:14    [18134549]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
СТУДЕНТ123
Guest
Странный подход для неизвестной постановки задачи, наверное лучше огласить ее целиком. Опыта за спиной не так много, но обычно при проектировании в БД использовал вспомогательные таблицы (хранят некие транзакции кто что делал).
10 сен 15, 19:24    [18134574]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Надо добавить полеl, в которое заносить ваш период протухания.
10 сен 15, 19:24    [18134575]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Winnipuh
Но как-то некомфортно удалять и добавлять поле в режиме изменения настроек юзером.
Возможны другие подходы к самой идее или к изменению параметра "количество дней"?

можно вынести эту настройку в отдельную таблицу и доставать её через скалярную функцию или вообще обращаться через вьюху без создания в таблице вычисляемого поля
10 сен 15, 19:25    [18134578]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гавриленко Сергей Алексеевич
Надо добавить полеl, в которое заносить ваш период протухания.


то есть так?

expiration_days int
deleted_expired AS (case when datediff(day,[deletion_date],getdate())>(expiration_days) AND [deleted]<>(0) then (1) else (0) end)


а что по индексам можно сделать при таком подходе, чтобы ускорить выборку всех протухших записей?

filtered index не пройдет я так понимаю
10 сен 15, 19:34    [18134623]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Winnipuh
а что по индексам можно сделать при таком подходе, чтобы ускорить выборку всех протухших записей?

filtered index не пройдет я так понимаю
Почему? Самое оно.
10 сен 15, 19:37    [18134639]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Winnipuh
filtered index не пройдет я так понимаю
Любой индекс не пройдет, не только фильтрованный. Из-за наличия getdate().
10 сен 15, 20:07    [18134735]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите идею: computed column  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Вычисляемое поле такое:
expire_date AS cast (dateadd(dd, [expiration_days], [deletion_date]) as datetime)

Сверху индекс.

Поиск "просроченных" осуществляется так:
where expire_date < getdate()
10 сен 15, 23:56    [18135413]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить