2011-02-19 48 views
0

我已經繼承了一個非常糟糕的設計和維護數據庫,並且一直在使用我對SQL Server的知識,並且保留這​​個高可用性服務器的一點運氣,並沒有完全消失(之前的開發人員,退出時基本上只保留了系統4年)。TOP 100導致SQL Server 2008掛起?

今天我遇到了一個很奇怪的問題。我希望有人能向我解釋這個,所以如果再發生這種情況,有一種方法可以解決它。

無論如何,有一個非常簡單的存儲過程。它將SHORT日期/時間範圍(5分鐘範圍)之間的兩個表連接在一起,並將結果傳回(此查詢每5分鐘通過一個Windows服務運行)。最大的桌子有100k排,最小的桌子有10k排。存儲的proc非常簡單並且具有以下功能:

注意:已更改表和列名稱以保護無辜者。現在,如果我在查詢中保留「TOP 100」,則查詢會掛起,直到我停止它(在SMS或存儲過程中運行)。如果我刪除TOP 100,查詢按計劃工作,並返回50-ish行,就像它應該(如果我們可以幫助它,我們不希望它返回超過100行)。

因此,我做了一些調查,使用sp_who,sp_who2,並查看了master..sys進程,並使用DBCC INPUTBUFFER查找可能鎖定或阻止的任何SPID。沒有塊,也沒有鎖定。

這只是今天開始沒有改變這些這兩個表設計,並從我上次收集這個查詢/表被觸摸的是3年前,並已運行沒有錯誤,因爲。

現在,一個側面說明,我不知道這是否會與此有任何關係。但是我之前大約24小時將這兩張表重新編入索引,因爲它們99%是分散的(請記住,我說這是設計不佳和服務器維護不佳)。

任何人都可以解釋爲什麼SQL Server 2008會這樣做嗎?

+0

如果你做了,它會有什麼區別嗎?在連接之前設置ROWCOUNT 100,然後從查詢中刪除TOP 100? – 2011-02-19 01:33:37

+0

仍然掛着SET ROWCOUNT 100,但是如果SET ROWCOUNT爲0. – Sean 2011-02-19 01:38:03

+0

如果刪除nolock提示,它會執行嗎?查詢計劃是什麼樣的? – JoshRoss 2011-02-19 01:40:09

回答

2

我會做的絕對第一件事情將會並排比較完整的查詢計劃和排名前100的查詢,並看看前100名是不是表演。您可能需要更新統計信息或甚至缺少索引。

0

我假設在mytable1.DateStarted上沒有索引。我認爲有些東西可能會決定在查詢過程中執行排序,當你選擇TOP TOP 100時。

3

ORDER BY是殺手。它必須讀取所有行,按列順序排序,然後給出前100行。