Что ж, если вы не эксперт, написанный вами запрос говорит мне, что вы по крайней мере довольно компетентны.Когда мы смотрим, является ли запрос «оптимизированным», есть две непосредственные части этого: 1. Запрос сам по себе имеет что-то явно неправильное - плохое объединение, неправильное использование ключевого слова, взрывной размер набора результатов, допущения о NOT IN
и т. Д. 2. Контекст, в котором работает запрос - специфика БД, специфика задачи и т. Д.
Ваш запрос проходит # 1, нет проблем.Я написал бы это по-другому - присвоил псевдоним таблице Person, использовал LEFT(P.FirstName, 1)
вместо SUBSTRING
и использовал бы CTE (WITH
-clause) вместо подзапроса.Но это не проблемы оптимизации.Возможно, я бы использовал WITH(READUNCOMMITTED)
, если результаты не были чувствительны к грязному чтению.Вне зависимости от контекста, ваш запрос не похож на бомбу, ожидающую взрыва.
Что касается # 2 - вам, вероятно, следует перейти к конкретике.Например, «Я должен запускать это каждую неделю. Это занимает 17 минут. Как я могу получить это менее чем за минуту?»Тогда люди спросят вас, как выглядит ваш план, какие у вас индексы и т. Д.
Вещи, которые я бы хотел знать:
- Сколько времени уже занимает выполнение?
- Какое у вас окно выполнения?(Допуск пользователя и приложения для времени запроса.)
- Этот запуск выполняется один раз в день?Неделю?Месяц?Квартал?
- У вас есть разрешение на создание таблиц, изменение текущих таблиц или изменение индексов?
- Может быть, исходя из того, что вы его запустили, какое соотношение дубликатов вы ожидаете найти?5%?90%?
- Насколько стабилен критерий соответствия?
Пример сценария: Если это была функция запуска по команде, она будет в моем приложении бесконечно долго, она будетзапускаться еженедельно, с ожидаемым количеством дубликатов на 10% или менее, с возможностью изменять БД так, как мне хотелось бы, если критерий соответствия дубликатов тверд (не колеблется), и я хочу сократить его с 90 до 5 с,Я бы создал выделенный столбец BirthYear
(возможно, постоянный вычисляемый столбец с BirthDate
) и индекс на LastName ASC, BirthYear ASC, FirstName ASC
.Если слишком многие из этих условий изменятся, я мог бы пойти в другом направлении.