филтриран индекс или индексиран изглед за Soft-delete с колона 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 [Изтрито] AS CASE WHEN (DeletedAt IS NULL) THEN 0 ELSE 1 END; - person jtimperley; 14.03.2015
comment
@Henry Не мисля, че е възможно да се създаде филтриран индекс върху изчислена колона. - person user1751825; 03.09.2019