sql - 提高选择不同查询的执行时间
问题描述
我在获取以下查询的完整结果集时遇到问题。当我选择不同的前 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'
解决方案
感谢您添加执行计划。我只能给你一些建议。
- 谓词OverallStatus = 'Onboarded' 是选择数据进行比较的选项。它从 CORE.WeccoParty 的总行中选择了多少行?如果它小于 <5-10%,您可以尝试在其上创建索引。你也可以先用这个谓词过滤的数据创建一个临时表,然后加入它们。
- 如果需要从 CORE.WeccoParty 中选择的数据多于 5-10%,则最好对这个表执行一次全扫描,以通过使用两个索引来消除数据选择,然后通过哈希运算连接结果。
- 看起来 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
- 您也可以尝试创建一个支持索引并测试性能
在 CORE.WeccoParty 上创建索引 IX_WeccoParty_1(OverallStatus、CompanyRegNum、CountryInc、GtId)
- 您是否尝试更新 CORE.WeccoParty 表上的统计信息。
通过查看执行计划,我敢打赌,这个合并连接可能是罪魁祸首加上在连接数据之前提取数据。
推荐阅读
- reactjs - React.js:循环通过一个状态数组来创建多个 JSON 请求
- javascript - 如何防止 jQuery Ajax 中的数据循环?
- android - com.bumptech.glide.load.engine.GlideException 类:仅在 Android 10 中无法加载资源
- python - 只返回枚举的属性,而不是 Class.Property
- php - 如何在同一个 PHP 页面中使用 PHP 函数进行多次调用?
- javascript - Chrome 扩展页面操作代码
- python - 在python中将ctypes Struct转换为bytearray
- firebase-cloud-messaging - 在nodejs中推送消息时如何设置小图标
- c# - 无法安装,因为提供程序名称 com.iceteck.silicompressor.provider(在包 MyPackagename2 中)已被 Package1 使用
- c# - DevExtreme 下拉框中的数据绑定不起作用