微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

高 CPU 利用率查询

如何解决高 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 举报,一经查实,本站将立刻删除。