ahmed_sa Ответов: 1

Когда запрос join с #tempplandcodetype становится очень медленным, так как же решить проблему низкой производительности ?


Я работаю на SQL server 2012 и сталкиваюсь с проблемой при добавлении этого оператора требуется 9 минут для отображения только 900 строк

SELECT fmat.Value as PLID,c.CodeTypeId,
COUNT(DISTINCT tr.PartID) [#partsHasCodes]
into #partsHasCodes
FROM Parts.TradeCodes tr WITH(NOLOCK) 
INNER JOIN Parts.Nop_Part pt WITH(NOLOCK) ON pt.PartID = tr.PartID
INNER JOIN Parts.Nop_PartsFamilyAttribute fmat WITH(NOLOCK) ON  fmat.PartFamilyID=pt.PartsFamilyID AND fmat.[Key]=20281007
inner join #TempPlAndCodeType c on (c.CodeTypeId=tr.CodeTypeID)
GROUP BY fmat.Value,c.CodeTypeId


без добавления этого утверждения ниже

(c.CodeTypeId=tr.CodeTypeID)

запрос занимает 3 минуты для отображения 900 строк и после добавления

(c.CodeTypeId=tr.CodeTypeID)

это займет 9 минут

при соединении с временной таблицей #TempPlAndCodeType время становится 9 минут.

Что я уже пробовал:

this is execution plan so what I do

https://www.brentozar.com/pastetheplan/?id=HJXDEp_bv

что я делаю, как показано ниже :
create clustered index idx on #TempPlAndCodeType (CodeTypeId)

но все равно это займет слишком много времени

0x01AA

В случае MS SQL: имейте в виду, что MS SQL автоматически не добавляет индекс для внешних ключей ;)

ahmed_sa

так что, пожалуйста, что я делаю

Gerry Schmitz

Упростите или продолжайте упорно трудиться.

1 Ответов

Рейтинг:
12

Richard Deeming

Согласно вашему расчетному плану выполнения, вы соединяете почти 50 миллионов строк с более чем 26 миллионами строк, а затем присоединяетесь еще к 3,5 миллионам строк. Для обработки этого запроса вашему серверу потребуется более 1,33 ГБ памяти.

Тот факт, что ваш конечный (расчетный) результат составляет всего 7 тысяч строк, не имеет значения. SQL по-прежнему должен обрабатывать миллионы строк в исходных таблицах, чтобы получить этот результат.

Начните с рассмотрения вашего фактического плана выполнения, а не предполагаемого плана. Попробуйте запустить советник по настройке ядра СУБД, чтобы узнать, какие индексы он рекомендует для вашего запроса, но не просто слепо применять их; тщательно оцените рекомендации, учитывая нормальную ожидаемую нагрузку на базу данных.