У меня есть таблица, которая может содержать от 10 000 до 10 миллионов строк в течение срока службы приложения. Эта таблица, помимо прочего, содержит информацию NACSZ, и мне нужно написать запрос, который проверяет соответствие NACSZ следующим образом:
select
*
from
Profiles
where
FirstName = 'chris' and
LastName = 'test' and
Address1 = '123 main st' and
City = 'chicago' and
State = 'il' and
Zip = '11111'
Я пытаюсь оптимизировать таблицу для этого запроса, которая будет выполняться внутри конструкции "if exist ()", и мне не повезло. Без индекса и ~ 110 000 строк тестовых данных я получаю:
Таблица «Профили». Количество сканирований 1,
логическое чтение 2021, физическое чтение 0,
опережающее чтение - 0, логическое чтение -
0, lob физическое чтение 0, lob
упреждающее чтение читает 0.
(затронут 1 ряд)
Время выполнения SQL Server: ЦП
время = 16 мс, прошедшее время = 70 мс.
Время выполнения SQL Server: ЦП
время = 0 мс, прошедшее время = 1 мс.
План выполнения указывает сканирование кластерного индекса по первичному ключу. Я думал о добавлении индекса для всех значений, но это создаст довольно большой ключ, и я хотел бы попытаться избежать этого, если это возможно. Моя следующая мысль заключалась в том, чтобы индексировать что-то, что будет разумно отличаться между строками, поэтому я попытался выполнить индексацию по имени (хотя я мог использовать адресную строку 1 или zip, например), поэтому я создал индекс:
create index ix_profiles_firstName on profiles(FirstName)
Теперь, когда я запускаю тот же запрос, я получаю
Таблица «Профили». Количество сканирований 1,
логическое чтение 171, физическое чтение 0,
опережающее чтение - 0, логическое чтение -
0, lob физическое чтение 0, lob
упреждающее чтение читает 0.
(затронут 1 ряд)
Время выполнения SQL Server: ЦП
время = 0 мс, прошедшее время = 52 мс.
Время выполнения SQL Server: ЦП
время = 0 мс, прошедшее время = 1 мс.
Очевидно, что индексирование имени имело ОГРОМНОЕ отличие. У меня вопрос, как мне решить, следует ли мне индексировать имя против фамилии против адреса против почтового индекса? Есть ли команда, которую я могу запустить поверх моих образцов данных, которая скажет мне уникальность значений в каждом поле? Насколько я понимаю, я должен попытаться индексировать столбец с наибольшей уникальностью, чтобы индекс работал лучше, верно?