Получить план выполнения
Вам нужно посмотреть на план выполнения, чтобы иметь любую надежду , чтобы понять реальную причину изменения времени отклика. В частности, в этом случае следует учитывать несколько факторов:
- Возможно, что некоторые запросы, возвращающие больше строк, выполняются быстрее, потому что они выполняют сканирование таблиц - у каждого есть детализация "сканирования таблицы медленно", но в зависимости от распределения данных сканирование таблицы может быть быстрее. чем 50000 строк поиска. Его просто невозможно определить без проверки выполнения.
- Также возможно, что неправильная статистика не позволяет SQL-серверу точно прогнозировать количество строк, которые он ожидает вернуть - если SQL-сервер ожидает 20 строк, но их действительно 20 000, то в более сложных запросах он, вероятно, в конечном итоге будет делать что-то в неправильном порядке, приводящем к очень медленному запросу - опять же, это просто невозможно определить без плана выполнения.
- В частности, использование
Freetext
означает, что используется механизм полнотекстового поиска, что может вызвать дополнительные проблемы с SQL-сервером при прогнозировании числа возвращаемых строк.
Действительно, получите план выполнения.
Обновление:
Возможные причины
В отсутствие плана выполнения, я думаю, что наиболее вероятной причиной медленного выполнения являются плохие оценки условий на ZipCode
и Description
:
- Трудно оценить количество совпадений при условии
ZipCode
, поскольку его результат зависит от хранимой процедуры.
- Трудно оценить количество совпадений в условии
FreeText
, поскольку оно основано на результатах механизма полнотекстовых запросов.
Я считаю, что происходит то, что сервер SQL недооценивает количество строк, которые останутся после фильтрации, и применяет запросы в неправильном порядке. В результате он выполняет десятки (возможно, сотни) тысяч поисков, что намного медленнее, чем просто сканирование таблицы.
Для очень сложного запроса я видел, как SQL-сервер выполнял ~ 3 000 000 запросов, пытаясь вернуть одну строку - в таблице даже не было 3 000 000 строк!
Что нужно попробовать - поместите ZipCodeForRadius во временную таблицу.
Если я прав, то, чтобы помочь с первым, вы можете попытаться поместить результаты хранимой процедуры ZipCodesForRadius
во временную таблицу, я должен признать, что у меня нет хорошего объяснения, почему это поможет , но у меня есть несколько теорий о том, почему может помочь:
- Лучшая статистика по временной таблице
- Побочный эффект будет вызывать перекомпиляцию основного оператора
SELECT
каждый раз, когда вы запускаете запрос (если диапазон почтовых индексов не очень мал) - в любом случае процесс занимает несколько секунд, это будет Хорошо, если есть большие различия в соответствующих почтовых индексах. Если нет, то есть способы предотвратить перекомпиляцию.
Это, безусловно, не должно наносить слишком много урона в любом случае.