SQL Server 2005 — выбор производительности — ГДЕ и NULL

У меня есть следующая проблема:

SQL Server 2005

  • Таблица: Документы
  • Рекордов: 400 000
  • Значение поля НЕ ЯВЛЯЕТСЯ ИНДЕКСОМ
  • Запрос:

    SELECT * FROM Documents WHERE value = 0  
    

СЛУЧАЙ А:

  • ВСЕ 400 000 записей имеют значение = NULL
  • Производительность = X секунд

СЛУЧАЙ Б:

  • 200 000 записей имеют значение = NULL
  • 200 000 записей имеют значение ‹> NULL
  • Производительность = X + Y секунд

СЛУЧАЙ С:

  • 400 000 записей имеют значение ‹> NULL
  • Производительность = X + Y + Z секунд

Это обычное поведение, или мне нужно искать причину степеней производительности где-то еще?


person Duncan_McCloud    schedule 10.07.2013    source источник
comment
Запустите SET STATISTICS IO ON;SET STATISTICS TIME ON; и опубликуйте вывод для падежей, а не для букв алфавита.   -  person Martin Smith    schedule 11.07.2013
comment
Это немного сложно сделать, потому что у меня нет доступа к рабочей базе данных. Допустим, производительность снизилась на 30%.   -  person Duncan_McCloud    schedule 11.07.2013


Ответы (1)


У вас почти наверняка нет индекса в столбце value. Учитывая это предположение, ваши результаты не очень удивительны. NULL внутренне хранится как отдельный бит, который проще найти (и отклонить), чем выполнять числовое сравнение.

Если бы у вас был индекс, то я был бы несколько удивлен этими результатами. Также было бы полезно, если бы вы разместили точные цифры о таблице (ширине столбцов), а также какие именно результаты вы видели вместо «X, Y и Z». И, как всегда, при проверке проблем с производительностью просматривайте план запроса.

person PinnyM    schedule 10.07.2013