MSSQL Разный план выполнения для одного и того же запроса / данных - PullRequest
0 голосов
/ 09 октября 2018

У меня есть запрос, который выполняется «быстро» на производстве, но очень медленно (1 час) на тестовых серверах.

Спрашивается следующий запрос:

select z.PrimaryKeyColumn
FROM [table1] z 
inner join Table2 p on  p.PrimaryKeyColumn=z.PrimaryKeyColumn
left outer join table3 pz on z.PrimaryKeyColumn==Rtrim(rtrim(pz.column2)+LTRIM(pz.column3))

Я проанализировал план выполнения запроса и понял, что на производстве он использует хеш-соответствие, а на тесте он использует цикл для первого соединения, отсюда и медлительность,Я перестроил индексы и обновил статистику, но результат тот же.

Кроме того, на сервере TEST, где результаты медленные, я скопировал / продублировал таблицу Table2 с индексами и данными, и когда я это используюВ таком случае запрос выполняется быстро, как на рабочем сервере ...

Это планы выполнения запроса:

ТЕСТ-сервер:

ПРОИЗВОДСТВЕННЫЙ сервер:

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Тот факт, что когда вы скопировали таблицу 1 и таблицу 2 в новые копии, преобразовал план запроса в тот же, что и в программе «Производство», это указывает на то, что в оценках количества элементов есть отличия от оригинала и копии.

Должны быть некоторые различия в статистике, созданной для таблиц, поэтому проверьте между ними, что они имеют одинаковую статистику, созданную для оригинала и копии.

Также просмотрите гистограммы для статистики, особенно связанной сМежду планами наблюдаются разные варианты выбора индексов - шаги выглядят одинаково?

Кроме того, возможно ли это очевидно, и вы уже подтвердили - но существуют ли в таблицах все те же индексы?

0 голосов
/ 09 октября 2018

Возможно оба сервера не одинаковы или имеют разную конфигурацию.НО что-то, что не является необходимым, удалите функции RTRIM (), сравнив u, будет иметь тот же результат.

...