2010-07-08 26 views
-1

我被我的老闆給這個SQL查詢並告知要提高SQL Server查詢/優化它如何提高包含嵌套子查詢

DECLARE @pol_0 int, @pol_1 int, @pol_2 int, @pol_3 int, @pol_4 int, @pol_5plus int, 
    @peril_0 int, @peril_1 int, @peril_2 int, @peril_3 int, @peril_4 int, @peril_5plus int, 
    @loc_1 int, @loc_2_10 int, @loc_11_100 int, @loc_101_1000 int, @loc_1001_5000 int, @loc_5001plus int, 
    @locfass int, @polfass int, @pollim int, @polattpt int, @polded int, @maxded int, @polres int, @sublimit int, 
    @sitelim int, @siteded int, @SS int, @WX int, @QS int, @CAT int, @CORP int, @SL int, 
    @ty_port int, @ty_acct int, @ty_pol int, @ty_loc int, 
    @2mod_eq_0 int, @2mod_eq_1_10 int, @2mod_eq_11_20 int, @2mod_eq_21_27 int, 
    @2mod_hu_0 int, @2mod_hu_1_10 int, @2mod_hu_11_20 int, @2mod_hu_21_27 int 

SELECT @pol_0 = COUNT(CASE CNT WHEN 0 THEN 99 ELSE NULL END), 
    @pol_1 = COUNT(CASE CNT WHEN 1 THEN 99 ELSE NULL END), 
    @pol_2 = COUNT(CASE CNT WHEN 2 THEN 99 ELSE NULL END), 
    @pol_3 = COUNT(CASE CNT WHEN 3 THEN 99 ELSE NULL END), 
    @pol_4 = COUNT(CASE CNT WHEN 4 THEN 99 ELSE NULL END), 
    @pol_5plus = COUNT(CASE WHEN CNT >= 5 THEN 99 ELSE NULL END) 
FROM (SELECT ACCGRP.ACCGRPID, 
       COUNT(POLICYID) AS CNT 
     FROM  ACCGRP 
       LEFT OUTER JOIN POLICY 
       ON  ACCGRP.ACCGRPID = POLICY.ACCGRPID 
     GROUP BY ACCGRP.ACCGRPID 
     ) 

我的第一個想法就是放棄聲明和再轉換伯爵的成像

SELECT 
(select COUNT(CASE CNT WHEN 0 THEN 99 ELSE NULL END), 
(select COUNT(CASE CNT WHEN 1 THEN 99 ELSE NULL END), 
(select COUNT(CASE CNT WHEN 2 THEN 99 ELSE NULL END), 
(select COUNT(CASE CNT WHEN 3 THEN 99 ELSE NULL END), 
(select COUNT(CASE CNT WHEN 4 THEN 99 ELSE NULL END), 
(select COUNT(CASE CNT WHEN >= 5 THEN 99 ELSE NULL END) FROM 

FROM條款有一個嵌套子查詢

FROM (SELECT ACCGRP.ACCGRPID, COUNT(POLICYID) AS CNT FROM ACCGRP LEFT OUTER JOIN POLICY ON ACCGRP.ACCGRPID = POLICY.ACCGRPID 
GROUP BY ACCGRP.ACCGRPID) 

我被某人的建議刪除嵌套的子查詢,但我不完全確定什麼是嵌套子查詢的更好的替代方案。任何建議將不勝感激!

回答

0

因此,子查詢確定每個ACCGRPID的策略數量。您是否已經有ACCGRP.ACCGRPIDPOLICY.ACCGRPID的索引?如果是這樣的話,我看不出有多大的空間來優化這個(除了預先計算),因爲它是第二步的必要輸入。

您在5之後沒有使用COUNT值,因此它可能正在掃描一些不必要的行,但我想不出一種方法來避免這種情況,它可能不值得嘗試,除非這是一個很大的比例記錄。

也許做的COUNT(POLICY.ACCGRPID)代替COUNT(POLICYID)可能有幫助,如果它不改變語義POLICY.ACCGRPID已經被查詢其他地方使用,它可能避免不必要的查找或允許較窄的指數使用。你必須查看查詢計劃,看看這是否有所作爲。可能的話,如果它有not null約束,SQL Server將會進行這種優化。

你爲什麼被要求優化它?是否導致性能問題?如果是的話,你可以發佈執行計劃嗎?

1

這個查詢真的很慢嗎?

如果是這樣,那麼你應該得到一個執行計劃,並根據結果進行優化。

如果沒有,那麼沒有什麼可以優化! :-)

有一個常見的誤解,即嵌套子查詢很慢,但事實並非如此。在特定情況下,嵌套子查詢可能會導致性能問題,但是在一般情況下,嵌套子查詢通常會由SQL Server優化爲與連接類似的執行計劃。

+1

+1 true - 首先測量,然後優化。也許只有一個索引缺失或某事,但查詢本身不是罪魁禍首。 – 2010-07-08 05:26:52