2013-09-27 34 views
0

我是這個初學者,所以希望你能幫上忙。我在SQL服務器2008R2工作,並具有從四個表都連接在一起組成一個觀點:如何加快此SQL視圖?

SELECT DISTINCT ad.award_id, 
       bl.funding_id, 
       bl.budget_line, 
       dd4.monthnumberofyear AS month, 
       dd4.yearcalendar  AS year, 
       CASE 
        WHEN frb.full_value IS NULL THEN '0' 
        ELSE frb.full_value 
       END     AS Expenditure_value, 
       bl.budget_id, 
       frb.accode, 
       'Actual'    AS Type 
FROM dw.dbo.dimdate5 AS dd4 
     LEFT OUTER JOIN dbo.award_data AS ad 
        ON dd4.fulldate BETWEEN ad.usethisstartdate AND 
              ad.usethisenddate 
     LEFT OUTER JOIN dbo.budget_line AS bl 
        ON bl.award_id = ad.award_id 
     LEFT OUTER JOIN dw.dbo.fctresearchbalances AS frb 
        ON frb.el3 = bl.award_id 
         AND frb.element4groupidnew = bl.budget_line 
         AND dd4.yearfiscal = frb.yr 
         AND dd4.monthnumberfiscal = frb.period 

視圖有9列和150萬行和增長。從這個視圖選擇*需要20分鐘的所有行。我在加入表的字段中添加了索引,並將其改進爲10分鐘。我的問題是我還能做些什麼才能讓選擇更快運行?

非常感謝,紫。

+2

你使用'SSMS中運行,看看那裏的瓶頸時,包括實際的執行Plan'? – christiandev

+0

你有沒有嘗試使用[SQL事件探查器??](http://msdn.microsoft.com/en-us/library/ff650699.aspx) –

回答

0

嘗試擺脫case語句。

如果您有150萬行,如果您對這些行的聚合而不是整個集合感興趣,則可能需要先對fctResearchBalances中的行進行求和,然後再進行連接。

(這是一個有點難以確定你可能會從,受益還有什麼沒有看到的訪問計劃。)

+1

情況下,選擇意味着更多的CPU使用,在這種情況下 –

0

1 - 您可以使用存儲過程有緩衝區高速緩存。你可以使用索引視圖,這意味着在模式綁定視圖上創建索引。 3,你可以在連接中使用查詢提示來命令查詢優化器使用特殊類型的連接。 4,你可以使用表格分區。

0
SELECT DISTINCT --#1 - potential bottleneck 
        ad.award_id 
       , bl.funding_id 
       , bl.budget_line 
       , [month] = dd4.monthnumberofyear 
       , [year] = dd4.yearcalendar 
       , Expenditure_value = ISNULL(frb.full_value, '0') 
       , bl.budget_id 
       , frb.accode 
       , [type] = 'Actual' 
    FROM dbo.dimdate5 dd4 
    LEFT JOIN dbo.award_data ad ON dd4.fulldate BETWEEN ad.usethisstartdate AND ad.usethisenddate 
    LEFT JOIN dbo.budget_line bl ON bl.award_id = ad.award_id 
    LEFT JOIN dbo.fctresearchbalances frb ON frb.el3 = bl.award_id --#2 - join by multiple columns 
     AND frb.element4groupidnew = bl.budget_line 
     AND dd4.yearfiscal = frb.yr 
     AND dd4.monthnumberfiscal = frb.period 
+0

可以完全微不足道你提供你的表的DDL或你的執行計劃。 – Devart

0

CASE語句可以通過

COALESCE(frb.full_value,'0') AS Expenditure_value 

沒有更多的信息可以取代它不可能告訴什麼是錯的,但只給你一些指點。 當你有這麼多的左連接,連接的順序可以有所作爲。 您是否有標準索引或覆蓋包含列的索引? 如果您沒有覆蓋索引,則主鍵在連接中很重要。在連接條件中包含所有主鍵列將加快查詢速度。

然後看看你的數據 - 你需要所有這些LEFT JOINS基礎上,這些表的外鍵?根據您的鍵,LEFT JOIN可能相當於INNER JOIN。 並且所有這些LEFT JOINS都有DISTINCT真的有用嗎?

多少RAM你有?如果你有8GB +,那麼1.5米的行對於SQL Server來說沒有任何意義。您需要優化這些連接。