Покупает ли мне что-нибудь создание индексированного вычисляемого столбца для проверки нулей?

В моих таблицах есть столбцы DeletedDate, допускающие значение NULL, и всякий раз, когда я пишу запросы к этим таблицам, я обычно проверяю, чтобы убедиться, что DeletedDate IS NULL. Я думал, что если я создам индексированный, сохраняемый, вычисляемый столбец с именем IsDeleted, это может ускорить мои запросы, поскольку ему нужно будет проверять только одно битовое значение вместо того, чтобы индексировать серию даты.

[IsDeleted] AS (isnull(CONVERT([bit],case when [DeletedDate] IS NULL then (0) else (1) end),(0))) PERSISTED NOT NULL,

Однако я посмотрел на план выполнения, и оказалось, что он все еще смотрит на столбец DeletedDate (думаю, я мог неправильно прочитать план).

Делает ли это покупку что-нибудь или есть другой способ ускорить его для запросов, которые заботятся только о том, является ли столбец нулевым или нет?


person adam0101    schedule 03.05.2017    source источник
comment
Какая часть записей удалена?   -  person Gordon Linoff    schedule 03.05.2017
comment
@GordonLinoff очень мало на данный момент, но мы еще не полностью запустили приложение   -  person adam0101    schedule 03.05.2017
comment
Если это так, то вы ищете улучшения производительности в месте, где вы еще не знаете, что у вас есть проблемы с производительностью с самого начала. Это определение преждевременной оптимизации. Если вы просите чисто энциклопедические знания, я боюсь, что лучший способ найти ответ — это попробовать самому и измерить.   -  person Mike Nakis    schedule 03.05.2017
comment
Когда вы запрашиваете свою таблицу, является ли предикат для DeletedDate единственным предикатом или только одним из нескольких?   -  person Ben Thul    schedule 04.05.2017
comment
@BenThul мы обычно фильтруем запросы по нескольким столбцам.   -  person adam0101    schedule 04.05.2017


Ответы (1)


Индекс на DeletedDate (в большинстве случаев) будет полезен только в том случае, если подавляющее большинство строк не удалено. Почему? Потому что, если много записей удалено, то почти на каждой странице данных будут как удаленные, так и не удаленные записи.

Индекс не уменьшит количество страниц, которые необходимо прочитать. В таких условиях сканирование данных обычно происходит быстрее.

Одним из основных исключений является кластеризованный индекс, где DeletedDate является первым столбцом (или флагом удаления, полученным из этого столбца). В этом случае неудаленные записи и удаленные записи почти всегда находятся на разных страницах данных. Таким образом, если 5% записей будут удалены, вам нужно будет прочитать только около 5% данных.

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

person Gordon Linoff    schedule 03.05.2017
comment
Подавляющее большинство строк не не удалены (нулевой DeletedDate), поэтому хорошо знать, что индекс по DeletedDate поможет при фильтрации этого столбца в моих запросах, но вы не упомянули вычисляемый столбец в ваш ответ. Поможет ли вообще индексированный вычисляемый столбец? - person adam0101; 03.05.2017
comment
Отфильтрованный индекс может. Большая часть этого обсуждения зависит от фактического запроса или запросов, которые вы используете. И не забывайте, что ничего не бывает бесплатно. Вы платите за индекс при изменении строк. Если очень хотите узнать, ответ один - попробуйте и сравните планы. - person SMor; 03.05.2017