调整具有多个联接的查询


8

我有这个查询.. 214执行/分钟,平均44.42 CPU(ms)有没有办法使它更快

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;

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

使用飞盘推荐的查询

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

使用哈希联接

在此处输入图片说明

在此处输入图片说明


查询现在需要运行多少时间?为何每分钟执行200次?您能解释一下如此频繁地将结果保存到临时表中的必要性吗?
ypercubeᵀᴹ

此查询在SP中,而临时表在下一个查询中使用。每分钟大约有20 K个请求。
sebeid 2015年

Answers:


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有索引,则对最有意义的索引进行排序

如果那不能改善响应,则只对所有对象强制执行哈希联接
仍在我的答案中使用select-将HASH添加到上面的查询中

INNER HASH JOIN

我尝试了您的查询,但没有太大的改进。我也知道不建议在生产中使用INNER Hash Join。我也没明白你的意思“仍然在我的答案中使用选择”
sebeid 2015年

没有太大的改进-这是一件坏事吗?不建议在生产中使用INNER Hash Join?你是从哪里听来的?您为什么不尝试一下呢?
狗仔队2015年

将执行计划添加到了..此查询在生产中最消耗CPU和IO。基于这个数字,我的持续时间越来越长,写入次数越来越多,CPU也一样
sebeid 2015年

stackoverflow.com/questions/800124/… ..但我会尝试一下,让您知道。谢谢
sebeid 2015年

AF.Id = 6286在查询中不是硬编码的,它是传递给SP的参数。我只是用这个数字进行测试
sebeid 2015年

1

尝试创建以下索引(假设它不存在)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)

有一个关于AcademicInstitutionid的非聚集索引和一个关于ID的聚集索引..
sebeid 2015年

具体来说,在AcademicInstitutionid的索引上是否包含(名称)?
肯尼斯·费舍尔

是的,还包括名称..是1个索引还是2个索引
无关紧要

1
您的意思是您在id上具有聚集索引,而在AcademicInstitutionId上包含第二个索引include(name)?我将继续创建复合索引。如果您查看自己的计划,则大多数计划都在进行聚集索引查找。想法是尝试使其成为索引查找。
肯尼思·费舍尔

0

在对脚本进行任何更改之前,只需对所有涉及的表进行索引重建,看看是否有任何明显的增加。(至少,要使用完全扫描重建表级统计信息)

[程序]似乎是一个大表,请确保对P.AssociationOrgId进行了索引。


我每天都会重建统计数据,并且所有索引都会重建
sebeid 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.