2017-08-25 60 views
0

第一次在這裏發佈海報。SQL Server 2008 - 查詢永遠在多個表上運行

我有一個問題,試圖運行在我的數據庫查詢。這是一個相對簡單的查詢,但涉及多個表(10),大量行(〜60k +)和許多列(〜200 +)。

當我試圖執行它運行看似永遠查詢(2小時+)和數據庫大小的氣球了從最初的5GB到60GB之前,我殺死進程。我在每張桌子上都設置了一個主鍵,希望能夠加快這個過程,但沒有什麼不同。

怪異的問題是,雖然我已經嘗試運行此時間11個表上具有相同結構的另一個數據庫中類似的查詢,但和我有結果出來10分鐘內執行。

什麼我應該檢查任何建議將不勝感激。

感謝

示例代碼

SELECT 
    A.DBUID, A.DAUID, A.CSDUID, A.CSDNAME, 
    A.CDUID, A.CDNAME, A.PRUID, 
    --W1 
    A.[COM1-W1-LC] + B.[COM2-W1-LC] + C.[COM3-W1-LC] + D.[COM4-W1-LC] + 
     E.[COM5-W1-LC] + F.[COM6-W1-LC] + G.[COM7-W1-LC] + H.[COM8-W1-LC] + 
     I.[COM9-W1-LC] + J.[COM10-W1-LC] AS 'W1-LC', 
    A.[COM1-W1-LS] + B.[COM2-W1-LS] + C.[COM3-W1-LS] + D.[COM4-W1-LS] + 
     E.[COM5-W1-LS] + F.[COM6-W1-LS] + G.[COM7-W1-LS] + H.[COM8-W1-LS] + 
     I.[COM9-W1-LS] + J.[COM10-W1-LS] AS 'W1-LS', 
    A.[COM1-W1-PC] + B.[COM2-W1-PC] + C.[COM3-W1-PC] + D.[COM4-W1-PC] + 
     E.[COM5-W1-PC] + F.[COM6-W1-PC] + G.[COM7-W1-PC] + H.[COM8-W1-PC] + 
     I.[COM9-W1-PC] + J.[COM10-W1-PC] AS 'W1-PC', 
    A.[COM1-W1-MC] + B.[COM2-W1-MC] + C.[COM3-W1-MC] + D.[COM4-W1-MC] + 
     E.[COM5-W1-MC] + F.[COM6-W1-MC] + G.[COM7-W1-MC] + H.[COM8-W1-MC] + 
     I.[COM9-W1-MC] + J.[COM10-W1-MC] AS 'W1-MC', 
    A.[COM1-W1-MS] + B.[COM2-W1-MS] + C.[COM3-W1-MS] + D.[COM4-W1-MS] + 
     E.[COM5-W1-MS] + F.[COM6-W1-MS] + G.[COM7-W1-MS] + H.[COM8-W1-MS] + 
     I.[COM9-W1-MS] + J.[COM10-W1-MS] AS 'W1-MS', 
    A.[COM1-W1-HC] + B.[COM2-W1-HC] + C.[COM3-W1-HC] + D.[COM4-W1-HC] + 
     E.[COM5-W1-HC] + F.[COM6-W1-HC] + G.[COM7-W1-HC] + H.[COM8-W1-HC] + 
     I.[COM9-W1-HC] + J.[COM10-W1-HC] AS 'W1-HC', 
    A.[COM1-W1-HS] + B.[COM2-W1-HS] + C.[COM3-W1-HS] + D.[COM4-W1-HS] + 
     E.[COM5-W1-HS] + F.[COM6-W1-HS] + G.[COM7-W1-HS] + H.[COM8-W1-HS] + 
     I.[COM9-W1-HS] + J.[COM10-W1-HS] AS 'W1-HS', 

    -- this continues on for ~200 sets 
INTO 
    COM_Results 
FROM 
    SeismicDesign_COM1 A 
INNER JOIN 
    SeismicDesign_COM2 B ON A.DAUID = B.DAUID 
INNER JOIN 
    SeismicDesign_COM3 C ON A.DAUID = C.DAUID 
INNER JOIN 
    SeismicDesign_COM4 D ON A.DAUID = D.DAUID 
INNER JOIN 
    SeismicDesign_COM5 E ON A.DAUID = E.DAUID 
INNER JOIN 
    SeismicDesign_COM6 F ON A.DAUID = F.DAUID 
INNER JOIN 
    SeismicDesign_COM7 G ON A.DAUID = G.DAUID 
INNER JOIN 
    SeismicDesign_COM8 H ON A.DAUID = H.DAUID 
INNER JOIN 
    SeismicDesign_COM9 I ON A.DAUID = I.DAUID 
INNER JOIN 
    SeismicDesign_COM10 J ON A.DAUID = J.DAUID 
+2

是否每個表都有一個索引DAUID? DAUID是多部分索引中的第一個元素?也會顯示你的執行計劃(或者至少看看它在過程中的僵局應該很容易看到,因爲它會有最大的百分比)。可能存在各種各樣的問題,但通過查看執行計劃,我們可以確定最大的瓶頸並相應地花費的時間。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan – xQbert

+0

檢查,看看是否有是阻塞另一個進程運行這個 – HLGEM

+0

你可以選擇你的答案是正確的,而且滿足查詢條件的索引稱爲覆蓋索引,對於優化器來說,你可以查看它,然後查看你的巨大的寬行。第一或第二,掃描將需要大量的閱讀,因爲一行會迅速吸收你的範圍內的頁面,導致大量的邏輯/物理讀取。最後,你有一個表設計,超過200列? 這是 真的正常化了嗎? –

回答

2

我是小白。在閱讀了執行計劃的工作方式之後,我開始追溯我的代碼到一行,然後加入2個表格。結果在那裏出現了超過20萬行的結果,這是錯誤的。那是當我意識到我已經加入了DAUID而不是DBUID的表。 DAUID是用於聚合的下一個級別。

我就這麼一個簡單的錯誤尷尬。學過的知識!感謝所有提供他們建議的人!

+0

你的尷尬問題(如你所說)可以通過刪除它來刪除。 –