2016-06-20 101 views
2

我已經創建了一個存儲過程,用於從不同dbs中的幾個不同表中選擇要在臨時表中使用的臨時表。填滿桌子似乎一切正常。我嘗試加入他們時出現問題。這是我寫的查詢:SQL查詢不會停止執行

SELECT #temp1.id, 
    #temp2.first_name, 
    #temp2.last_name, 
    #temp3.DOB, 
    #temp4.Sex, 
    #temp5.SSN 
FROM (((#temp1 
LEFT JOIN #temp3 ON #temp1.id = #temp3.id) 
LEFT JOIN #temp4 ON #temp1.id = #temp4.id) 
LEFT JOIN #temp2 ON #temp1.id = #temp2.id) 
LEFT JOIN #temp5 ON #temp1.id = #temp5.id; 

查詢在一定程度上起作用。輸出窗口填充了選擇的結果。問題是查詢不會退出。它會停止向輸出添加新記錄,但會繼續執行,因此過程會掛起,因爲它無法移到下一個語句。有任何想法嗎?

+1

嘗試一次運行一個連接,並確定某個特定連接是否導致它掛起。您是否可以驗證應該返回的所有記錄是否在「掛起」時返回?每個表中有多少條記錄? ID在所有表上都是唯一的嗎?如果有重複,返回的記錄數可能非常大。有了這些問題的答案,這裏的人們可能會更容易幫助你。列名稱和類型也會有幫助。 –

+0

你是什麼意思查詢不退出?如果查詢未完成,則可能表示查詢中出現問題。 –

+1

你看過實際執行計劃嗎?你可以嘗試的另一件事是重新編譯存儲過程。有時,如果數據庫對其數據或結構進行重大更改,則重新編譯過程會更新並優化該過程針對這些更改的查詢計劃。這可以提高過程的處理性能。 –

回答

0

#temp1中有多少條記錄?你在輸出窗口中看到相同數量的記錄嗎?如果不是,那麼你的查詢仍然返回記錄。

另外,你是否明確地開始一個事務在腳本的某個地方?也許它正在等待你提交或回滾。

此外,我不知道爲什麼你有加入的括號。它們不是必需的(也許你正在通過使用它們來獲得一些奇怪的執行計劃)。

2

我可以看到您的查詢導致執行計劃中所有5個表的高表掃描。您可以在所有5個臨時表上創建連接柱(ID)指標如下:

CREATE CLUSTERED INDEX IDX_C_t1_ID ON #temp1(ID) 
CREATE CLUSTERED INDEX IDX_C_t2_ID ON #temp2(ID) 
CREATE CLUSTERED INDEX IDX_C_t3_ID ON #temp3(ID) 
CREATE CLUSTERED INDEX IDX_C_t4_ID ON #temp4(ID) 
CREATE CLUSTERED INDEX IDX_C_t5_ID ON #temp5(ID) 

這將會是真正有用的,如果你可以包括行數和列數了所有的5臺。

0

此查詢的運行時間取決於(其中其他)對#temp1中排的數和在指標,它有(默認情況下 - >無)。

第一步將如我所見:
隔離執行計劃,專門爲此查詢。你可以這樣做,通過填寫您的數據轉化爲temp1(而不是#temp1),

然後 - 嘗試運行僅針對temp1查詢。

查看查詢的執行計劃可能會推薦哪些索引可能會有所幫助,並且是優化它的第一步。