如何解决高 CPU 利用率查询
我有以下查询,它在 sql Server 2017 网络版服务器上消耗高 cpu。
SELECT disTINCT IM_ID,IM_NAME,IM_ADDR_ID
FROM MST_INSURANCE
WHERE IM_NAME >= 'a'
AND IM_NAME <= 'Zzzzzzz'
AND EXISTS
(SELECT BLH_ID
FROM TRN_BILLING_HEAD,TRN_BILLING_DET
WHERE BLH_BOOL_INACTIVE = 0
AND BLH_TRNTYPE = 'BL'
AND BLD_BLH_ID = BLH_ID
AND BLH_CLaim_STATUS = 'B'
AND BLD_BOOL_DO_NOT_SEND = 0
AND BLD_RESP_Now <= 2
AND (
(BLD_RESP_Now = 0
AND BLH_INS1_ID = IM_ID)
OR
(BLD_RESP_Now = 1
AND BLH_INS2_ID = IM_ID)
OR
(BLD_RESP_Now = 2
AND BLH_INS3_ID = IM_ID)
)
)
ORDER BY 2,1
我知道使用的查询结构是旧的,因此我尝试通过在查询中添加 INNER JOIN 并删除 EXISTS 子句来优化查询,如下所示。这有助于优化查询成本,但我想我已经改变了查询逻辑。
SELECT disTINCT IM_ID,IM_ADDR_ID,BLH_ID FROM MST_INSURANCE AS INSU
INNER JOIN TRN_BILLING_HEAD AS HEAD ON BLH_INS1_ID = IM_ID AND BLH_INS2_ID = IM_ID AND BLH_INS3_ID = IM_ID
INNER JOIN TRN_BILLING_DET AS DET ON BLD_BLH_ID = BLH_ID
WHERE
IM_NAME >= 'a' AND IM_NAME <= 'Zzzzzzz' AND
BLH_BOOL_INACTIVE = 0 AND BLH_TRNTYPE = 'BL'
AND BLH_CLaim_STATUS = 'B' AND BLD_BOOL_DO_NOT_SEND = 0 AND BLD_RESP_Now <= 2
AND (BLD_RESP_Now = 0 OR BLD_RESP_Now = 1
OR BLD_RESP_Now = 2) ORDER BY 2,1
我不是开发人员,因此发现很难优化查询。 任何人都可以建议查询中的任何更改吗?
解决方法
谢谢大家的回复,真的很感谢。
我在原始查询中包含了一些 JOIN,如下所示,这显着降低了查询成本。
SELECT DISTINCT IM_ID,IM_NAME,IM_ADDR_ID FROM MST_INSURANCE AS INSU
INNER JOIN TRN_BILLING_HEAD AS HEAD ON BLH_INS1_ID = IM_ID OR BLH_INS2_ID = IM_ID OR BLH_INS3_ID = IM_ID
INNER JOIN TRN_BILLING_DET AS DET ON BLD_BLH_ID = BLH_ID
WHERE
IM_NAME >= 'a' AND IM_NAME <= 'Zzzzzzz' AND
BLH_BOOL_INACTIVE = 0 AND BLH_TRNTYPE = 'BL'
AND BLH_CLAIM_STATUS = 'B' AND BLD_BOOL_DO_NOT_SEND = 0 AND BLD_RESP_NOW <= 2
AND (BLD_RESP_NOW = 0 OR BLD_RESP_NOW = 1
OR BLD_RESP_NOW = 2) ORDER BY 2,1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。