Настройка запроса с несколькими объединениями

8

У меня есть этот запрос .. 214 Выполнение / мин, 44.42 Ср ЦП (мс) есть способ сделать это намного быстрее

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN  unicas_config..ReferenceData RD 
                 ON P.STATE = RD.ValueId AND RD.ValueAbbr ='US'
  INNER JOIN  unicas_config..ReferenceDataSet RS  
           ON RD.ReferenceSetId = RS.SetId AND RS.NAME = 'LK_States'

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Теперь это, если я разделю на 2 запроса

select RD.ValueId, RD.id into #temp1
from   unicas_config..ReferenceData RD
INNER JOIN  unicas_config..ReferenceDataSet RS   ON RD.ReferenceSetId= RS.SetId AND RS.NAME= 'LK_States'
where RD.ValueAbbr='US';


SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN    #temp1 RD ON P.STATE= RD.ValueId;

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

используя запрос, рекомендованный Фрисби

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Использование Hash join

введите описание изображения здесь

введите описание изображения здесь

sebeid
источник
Сколько времени требуется для выполнения запроса сейчас? И почему это выполняется 200 раз в минуту? Можете ли вы объяснить необходимость часто сохранять результаты во временную таблицу?
ypercubeᵀᴹ
этот запрос находится в SP, а временная таблица используется в следующем запросе. это производство имеет около 20 тыс. запросов в минуту.
Себеид

Ответы:

2

Попробуйте это у
вас есть (потенциально) неуместные условия соединения

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM       UNICAS_CONFIG..Organization O                 
INNER JOIN UNICAS_CONFIG..AcademicInstitution AI
            ON AI.id = O.academicInstitutionid        
INNER JOIN unicas_config..applicationForm AF
            ON AF.casid = AI.casid  
           AND AF.Id = 6286   
INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
            ON asOrg.FormId         = AF.id
           and asOrg.OrganizationId = O.id
INNER JOIN UNICAS_CONFIG..Program P
            ON P.AssociationOrgId = asOrg.Id 
INNER JOIN unicas_config..ReferenceData RD 
            ON RD.ValueId = P.STATE  
           AND RD.ValueAbbr ='US'
INNER JOIN unicas_config..ReferenceDataSet RS  
            ON RS.SetId = RD.ReferenceSetId   
           AND RS.NAME = 'LK_States'

Если у #temp есть индексы, тогда сортируйте по тому, который имеет смысл

Если это не улучшит ответ, то просто принудительно используйте хеш-соединение для всех.
Используйте выбор в моем ответе - добавьте HASH в запрос выше.

INNER HASH JOIN
папараццо
источник
Я попробовал ваш запрос, но улучшения не так много. также я знаю, что не рекомендуется использовать INNER Hash Join в Production. Кроме того, я не
понял,
Не так много улучшений - это плохо? Не рекомендуется использовать INNER Hash Join в производстве? где ты услышал это? Почему бы тебе не попробовать это для улыбок?
Папараццо
добавил план выполнения к .. этот запрос наиболее потребляет ресурсы процессора и ввода-вывода на производстве. на основе числа, которое я получаю больше продолжительности и больше
записей
stackoverflow.com/questions/800124/… .. но я дам ему попытку и дам вам знать. спасибо
Себейд
AF.Id = 6286 не является жестко запрограммированным в запросе, это параметр, переданный SP. Я просто использовал это число для тестирования
sebeid
1

Попробуйте создать следующий индекс (если он еще не существует)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)
Кеннет Фишер
источник
Существует некластеризованный индекс для AcademicInstitutionid и Clustred Index для ID.
Sebeid
В частности, есть ли включить (имя) в указатель по академическому институту?
Кеннет Фишер
да, имя включено также .. имеет ли значение, если это 1 индекс или 2 индекса
sebeid
1
Вы имеете в виду, что у вас есть кластеризованный индекс по идентификатору, а второй по академическому указателю включает в себя (имя)? Я бы пошел вперед и создать составной индекс. Если вы посмотрите на свои планы, большинство из них делают поиск кластерного индекса. Идея состоит в том, чтобы попытаться сделать это поиском индекса вместо этого.
Кеннет Фишер
0

Прежде чем вносить какие-либо изменения в сценарий, просто выполните пересчет индекса для всех задействованных таблиц и посмотрите, есть ли существенное увеличение. (по крайней мере, сделайте перестройку статистики на уровне таблицы с полной проверкой)

[Program] выглядит как большая таблица, убедитесь, что P.AssociationOrgId проиндексирован.

jyao
источник
я перестраиваю статистику каждый день, и все индексы перестраиваются
sebeid