高 CPU 利用率查询

时间:2021-04-12 16:56:24

标签: sql sql-server qsqlquery

我有以下查询,它在 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_NAME, 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

我不是开发人员,因此发现很难优化查询。 任何人都可以建议查询中的任何更改吗?

1 个答案:

答案 0 :(得分:0)

谢谢大家的回复,真的很感谢。

我在原始查询中包含了一些 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
相关问题