Включений стовпчик проти відфільтрованого індексу


11

Зараз ми працюємо з таблицею з назвою tb_tranfers . Ця таблиця має 40 мільйонів рядків і має розмір ~ 26 ГБ (дані 11 ГБ, індекси 15 ГБ).

10 - 15% рядків - це рядки з м'яким видаленням ( Видалений дат не є нульовим). Додаток використовує лише рядки, де DeletedDate є нульовим. Усі запити до цієї таблиці будуть містити пункт про це.

У цій таблиці 15 індексів. Відсутній індекс DMV містить пропозиції щодо створення індексів із DeletedDate як включений стовпець.

Було б корисно використовувати відфільтрований індекс WHERE DeleteDdate IS NULLна всіх 11 індексах, що не містять кластеру? Або було б краще мати стовпчик " Видалений дат " як включений стовпець?

Відповіді:


12

Так, CREATE INDEX ... ON ... WHERE DeletedDate IS NULLдопоможе змінити всі 11 індексів NC для фільтрування індексів ( ). Таким чином ви отримуєте дві переваги:

  • Query Optimizer буде знати , що будь-який рядок виходячи з цих показників уже дійсно задовольняє ваші фільтри запиту на DeletedDate, тому він не буде мати для пошуку кластерного індексу перевірити ще раз DeletedDate
  • Усі індекси NC будуть на 10-15% меншими за розміром, вимагаючи менше пам’яті та меншої кількості операцій вводу-виводу для пошуку.

Компроміс полягає в тому, що будь-який запит, який доглядає за м'якими видаленими рядками (і повинен бути якийсь запит, інакше навіщо рядки існують?) Не зможе використовувати ці індекси NC.


7

Якщо ви ВИНАГИ використовуєте DeletedDate IS NULLфільтр у своїх запитах, то так, ви, швидше за все, побачите значне підвищення продуктивності, додавши фільтр.

Це набагато менше сторінок для того, щоб двигун перевіряв, щоб знайти відповідні рядки, а це означає менше IO (і більше швидкості).

Додавати його як INCLUDEDполе було б марно . Оскільки ви завжди включаєте його у фільтр (але, ймовірно, ніколи не додаєте його до списку SELECT), це поле ніколи не буде посилатися, якщо ви додасте його як INCLUDE.


2

Оскільки 85-90% рядків DeletedDate мають NULL, малоймовірно, що вибірковість індексу, що складається лише з DeletedDate, була б достатньою для того, щоб SQL використовував цей індекс. Однак, використано спільно з іншими більш селективними стовпцями, додавання DeletedDate до існуючих індексів повинно дати певну користь, якщо це збільшить загальну вибірковість індексу.

Як каже JNK, DeletedDate буде мало корисного для покриття індексів, якщо ви не використовуєте його в пункті SELECT.

Зважаючи на те, що в індексах вже є більше місця для зберігання, ніж для даних, ви також можете перевірити, чи не існує надмірності в існуючих 15 індексах NC.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.