Какой самый быстрый способ запроса значений NULL в SQL Server? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь найти все записи, которые содержат NULL в столбце.Столбец индексируется.Однако когда я устанавливаю условие where на

where person_key is null

, SQL Server реагирует очень долго.С другой стороны, запросы на поиск определенных значений возвращаются довольно быстро.

Есть ли способ написать запрос, чтобы ускорить поиск записей с NULL в person_key?Спасибо!

1 Ответ

1 голос
/ 13 июня 2019

Я пытаюсь найти все записи, которые содержат NULL в столбце. колонка индексируется. Тем не менее, когда я устанавливаю условие where на

where person_key is null

SQL Server очень долго не отвечает. Запросы ищем С другой стороны, конкретные значения возвращаются довольно быстро.

Есть ли способ написать запрос, чтобы ускорить поиск записи с NULL в person_key? Спасибо!

Как все прокомментировали выше, чтобы дать правильный совет, нужно дать немного больше информации. Вот несколько для начала:

  1. Сам запрос
  2. Базовая структура таблиц, включая существующие индексы
  3. План выполнения

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

Какой процент значений NULL в столбце person_key?

  • Если оно очень мало, то некластеризованный индекс хранилища строк в этом столбце должен быть в состоянии охватить ваш поиск. Все выбранные столбцы в запросе могут быть включены в предложение INCLUDE этого индекса. Связанные ссылки MVP, чтобы получить некоторое представление: https://www.brentozar.com/archive/2019/03/are-nulls-stored-in-a-nonclustered-index/

  • Если процент больше, вот несколько вариантов, которые могут помочь:

    • Создать отфильтрованный некластеризованный индекс хранилища строк для person_key с предложением WHERE person_key IS NULL. Отфильтрованный индекс уменьшит размер индекса для поиска и повысит производительность. Все выбранные столбцы в запросе могут быть включены в предложение INCLUDE этого индекса.
    • Создать в таблице некластеризованный индекс columnstore, который охватывает столбцы, используемые в запросе. Индекс Columnstore сжимает данные, сохраняя, когда это возможно, одно значение столбца, уменьшая размер данных для поиска и, следовательно, значительно повышая производительность запроса SELECT. Если какой-либо столбец имеет низкое количество элементов, повышение производительности за счет использования индекса columnstore для таких столбцов является существенным. Вы также можете сделать этот индекс отфильтрованным.
    • Вы можете подумать о том, чтобы сделать столбец SPARSE (при условии, что вы знаете ограничения для столбца SPARSE). Разреженные столбцы обрабатывают значения NULL чрезвычайно эффективно. https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-sparse-columns?view=sql-server-2017

Пожалуйста, помните, что вам нужно всегда смотреть, какие столбцы вы выбираете. Если вы выполняете SELECT * или в SELECT есть столбцы, которые не охватываются вашим индексом, это означает, что даже если вы можете использовать индекс для охвата поиска по столбцу person_key, но для извлечения значений оставшегося столбца, он должен посмотреть на существующий кластерный индекс или получить данные из HEAP, отсканировав все листовые страницы Это не сделает запрос быстрым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...