Ajustando a consulta com várias junções

8

Eu tenho esta consulta .. 214 Execução / min, 44,42 CPU média (ms) existe uma maneira de torná-lo muito mais rápido

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'

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Agora isso se eu dividir para 2 consultas

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;

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

usando a consulta recomendada pelo Frisbee

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Usando junção Hash

insira a descrição da imagem aqui

insira a descrição da imagem aqui

sebeid
fonte
Quanto tempo a consulta precisa executar agora? E por que é executado 200 vezes por minuto? Você pode explicar a necessidade de salvar os resultados em uma tabela temporária com tanta frequência?
ypercubeᵀᴹ
essa consulta está em um SP e a tabela temporária é usada na próxima consulta. essa produção tem cerca de 20 K de solicitação por minuto.
sebeid

Respostas:

2

Faça uma tentativa
Você tem algumas (potencialmente) condições de junção equivocadas

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'

Se #temp tiver índices, escolha o que faz mais sentido

Se isso não melhorar a resposta, basta forçar uma junção de hash em todos.
Ainda use o select na minha resposta - adicione o HASH à consulta acima

INNER HASH JOIN
paparazzo
fonte
Eu tentei sua consulta, mas não há muita melhoria. Também sei que não é recomendável usar o INNER Hash Join na produção. Também eu não conseguir o que você quer dizer com "ainda usam a escolha na minha resposta"
sebeid
Não há muita melhoria - isso é uma coisa ruim? Não recomendado usar INNER Hash Join na produção? onde você ouviu isso? Por que você não tenta sorrir?
Paparazzo
adicionou o plano de execução a .. esta consulta consome mais CPU e E / S na produção. com base no número que estou obtendo maior duração e mais gravações e mesma CPU
sebeid
stackoverflow.com/questions/800124/… .. mas vou tentar e informá-lo. obrigado
sebeid
AF.Id = 6286 não é codificado na consulta, é um parâmetro passado para o SP .. eu apenas usei esse número para teste
possível
1

Tente criar o seguinte índice (supondo que ele ainda não exista)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)
Kenneth Fisher
fonte
há um índice não agrupado em academicInstitutionid e um índice Clustred em ID ..
sebeid
Especificamente, há uma inclusão (nome) no índice em academicInstitutionid?
Kenneth Fisher
sim, o nome também está incluído .. importa se é 1 índice ou 2 índices?
comentado em 18/12/15
11
Você quer dizer que possui o índice clusterizado no id e o segundo no academicInstitutionId include (name)? Eu iria em frente e criaria o índice composto. Se você observar seus planos, a maioria deles está realizando buscas de índice em cluster. A idéia é tentar torná-lo uma busca de índice.
Kenneth Fisher
0

Antes de fazer qualquer alteração no script, basta executar um índice refutado em todas as tabelas envolvidas e ver se há algum aumento significativo. (pelo menos, reconstrua as estatísticas no nível da tabela com varredura completa)

[Program] parece uma tabela grande, verifique se P.AssociationOrgId está indexado.

jyao
fonte
eu reconstruo estatísticas todos os dias e todos os índices foram reconstruídos
sebeid