Я пытаюсь найти все записи, которые содержат NULL в столбце.
колонка индексируется. Тем не менее, когда я устанавливаю условие where на
where person_key is null
SQL Server очень долго не отвечает. Запросы ищем
С другой стороны, конкретные значения возвращаются довольно быстро.
Есть ли способ написать запрос, чтобы ускорить поиск
записи с NULL в person_key? Спасибо!
Как все прокомментировали выше, чтобы дать правильный совет, нужно дать немного больше информации. Вот несколько для начала:
- Сам запрос
- Базовая структура таблиц, включая существующие индексы
- План выполнения
Как уже упоминалось во многих комментариях, и из того, что я могу догадаться из предоставленной ограниченной информации, есть несколько вещей, на которые следует обратить внимание:
Какой процент значений 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, отсканировав все листовые страницы Это не сделает запрос быстрым.