第一次在這裏發佈海報。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
是否每個表都有一個索引DAUID? DAUID是多部分索引中的第一個元素?也會顯示你的執行計劃(或者至少看看它在過程中的僵局應該很容易看到,因爲它會有最大的百分比)。可能存在各種各樣的問題,但通過查看執行計劃,我們可以確定最大的瓶頸並相應地花費的時間。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan – xQbert
檢查,看看是否有是阻塞另一個進程運行這個 – HLGEM
你可以選擇你的答案是正確的,而且滿足查詢條件的索引稱爲覆蓋索引,對於優化器來說,你可以查看它,然後查看你的巨大的寬行。第一或第二,掃描將需要大量的閱讀,因爲一行會迅速吸收你的範圍內的頁面,導致大量的邏輯/物理讀取。最後,你有一個表設計,超過200列? 這是 真的正常化了嗎? –