首页 > 解决方案 > 提高选择不同查询的执行时间

问题描述

在此处输入图像描述我在获取以下查询的完整结果集时遇到问题。当我选择不同的前 10000 名时,我会在几秒钟内得到结果。当我把它拿出来时,它会持续运行 1 个多小时。我检查并尝试索引诸如 company reg num + country inc 之类的字段,但没有区别。Toad 建议添加以下索引:

USE [BW_DCF];
    GO
CREATE NONCLUSTERED INDEX [idx_Nonclustered_WeccoParty_OverallStatus]
ON [CORE].[WeccoParty]
([OverallStatus])
INCLUDE (
[GtId], [CrmPartyId], [FirstName], [LastName], [LegalName], [CountryInc], 
[BusinessClass], [RmFullName], [PbeFullName], [OverallClientStatus], 
[OverallRpStatus], [CompanyRegNum] 
)
WITH
(
PAD_INDEX = OFF,
FILLFACTOR = 100,
IGNORE_DUP_KEY = OFF,
STATISTICS_NORECOMPUTE = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON,
DATA_COMPRESSION = NONE
)
ON [BW_DCF_Group1];
GO



   select distinct wp1.GtId, 
  wp1.CrmPartyId, 
  wp1.LegalName, 
  wp1.BusinessClass, 
  wp1.RmFullName, 
  wp1.PbeFullName, 
  wp1.OverallClientStatus, 
  wp1.OverallRpStatus, 
  wp1.FirstName,
  wp1.LastName,  
  wp1.LegalName,
  wp1.CountryInc,
  wp1.CompanyRegNum,
  wp2.GtId, 
  wp2.CrmPartyId, 
  wp2.LegalName, 
  wp2.BusinessClass, 
  wp2.RmFullName, 
  wp2.PbeFullName, 
  wp2.OverallClientStatus, 
  wp2.OverallRpStatus,  
  wp2.FirstName,
  wp2.LastName,
  wp2.LegalName,
  wp2.CountryInc,
  wp2.CompanyRegNum
     from CORE.WeccoParty wp1
      join CORE.WeccoParty wp2 on   wp1.CompanyRegNum = wp2.CompanyRegNum
                    and wp1.CountryInc = wp2.CountryInc     
                    and wp1.GtId <> wp2.GtId 
                and wp1.OverallStatus = 'Onboarded'
            and wp2.OverallStatus = 'Onboarded'

标签: sqlsql-serversqlperformance

解决方案


感谢您添加执行计划。我只能给你一些建议。

  1. 谓词OverallStatus = 'Onboarded' 是选择数据进行比较的选项。它从 CORE.WeccoParty 的总行中选择了多少行?如果它小于 <5-10%,您可以尝试在其上创建索引。你也可以先用这个谓词过滤的数据创建一个临时表,然后加入它们。
  2. 如果需要从 CORE.WeccoParty 中选择的数据多于 5-10%,则最好对这个表执行一次全扫描,以通过使用两个索引来消除数据选择,然后通过哈希运算连接结果。
  3. 看起来 wp1 和 wp2 选择的数据之间的连接是由合并操作执行的。此操作需要首先对 wp1 和 wp2 的输入数据进行排序,尝试通过添加哈希连接提示来消除它:

FROM CORE.WeccoParty wp1 INNER HASH JOIN CORE.WeccoParty wp2 on
wp1.CompanyRegNum = wp2.CompanyRegNum

或嵌套循环连接:

FROM CORE.WeccoParty wp1 INNER LOOP JOIN CORE.WeccoParty wp2 on
wp1.CompanyRegNum = wp2.CompanyRegNum

  1. 您也可以尝试创建一个支持索引并测试性能

在 CORE.WeccoParty 上创建索引 IX_WeccoParty_1(OverallStatus、CompanyRegNum、CountryInc、GtId)

  1. 您是否尝试更新 CORE.WeccoParty 表上的统计信息。

通过查看执行计划,我敢打赌,这个合并连接可能是罪魁祸首加上在连接数据之前提取数据。


推荐阅读