отфильтрованный индекс или индексированное представление для мягкого удаления с столбцом deleteAt dateTime?

Мы используем столбец deleteAt, чтобы указать, является ли что-то активным или (мягко) удаленным. Какой метод лучше всего подходит для запроса активного содержимого?

Будет ли лучше отфильтрованный индекс для фактической таблицы или индексированное представление с deleteAt is NULL?

Это хороший вариант использования индексированного представления?

Или нам следует перейти к обычному просмотру с отфильтрованным индексом?


person Henry    schedule 14.03.2015    source источник


Ответы (1)


Вместо одного столбца Datetime для обработки мягкого удаления я бы использовал два столбца.

ColumnName    Data Type
 Deleted        BIT      DEFAULT(0) 
 DeletedAt    DateTime     

И создайте отфильтрованный индекс в столбце «Удаленные» что-то WHERE Deleted = 0.

Причина в том, что данные с обратимо удаленными строками мы в основном возвращаем только активные/неудаленные строки. Следовательно, каждый раз, когда вы возвращаете строки, сервер sql может просматривать отфильтрованный индекс для наименьшего типа данных (бит равен 1 байту) и выполнять меньшую обработку данных.

И если вы когда-нибудь захотите узнать, когда запись была удалена, столбец DaletedAt предназначен для хранения этой информации.

С другой стороны, если у вас есть только ОДИН столбец даты и времени для обработки мягкого удаления, ваш отфильтрованный индекс будет чем-то вроде WHERE DeletedAT IS NULL, теперь в этом случае SQL Server будет запрашивать 8 байтов данных только для того, чтобы проверить, активна ли строка или нет. В этом случае вы выполняете в 8 раз больше обработки данных по сравнению со столбцом BIT, чтобы получить те же результаты. Звучит плохо, не так ли :).

Следовательно, я рекомендую добавить еще один битовый столбец и отфильтрованный индекс для этого битового столбца для обработки мягкого удаления. Оставьте столбец DeletedAt для обработки только удалений.

person M.Ali    schedule 14.03.2015
comment
Это действительно имеет такое большое значение? и не может ли deleted быть вычисляемым столбцом в вашем случае использования? - person Henry; 14.03.2015
comment
это, вероятно, не будет иметь значения с несколькими сотнями строк и если таблица запрашивается только время от времени. но с большими таблицами и таблицами, которые часто запрашиваются, кумулятивный эффект будет огромным. - person M.Ali; 14.03.2015
comment
Удален вычисляемый столбец? как бы вы это вычислили?? - person M.Ali; 14.03.2015
comment
@M.Ali Используйте DateTime2 (2), чтобы уменьшить значение даты / времени до 6 байтов. ALTER TABLE ADD [Deleted] AS CASE WHEN (DeletedAt IS NULL) THEN 0 ELSE 1 END; - person jtimperley; 14.03.2015
comment
@ Генри Я не думаю, что можно создать отфильтрованный индекс для вычисляемого столбца. - person user1751825; 03.09.2019