2010-10-20 25 views
3

使用SQL Server 2005.我正在對具有大約200k條記錄的表進行一些簡單查詢。截至今天,當我開始工作時,一個簡單的SELECT * FROM將執行,直到它檢索到約20k行...然後停止。它不會超過20k行。如果我嘗試在使用ORDER BY Created DESC時只選擇一行,則查詢無限期地運行。我從來沒有遇到過這個。所有其他表格正常運作。我的桌子有可能被損壞了嗎?這實際上在一夜之間發生。該表格確實收集了實時數據,但幾個月來一直這樣做(通過表格),沒有問題。這可能是一些違反查詢的錯誤記錄嗎?如果是這樣,我怎麼能找到它...因爲我不能得到結果集了?SQL Server中的表不會返回超過幾千行

我很抱歉,如果這是模糊的,但我不知道該怎麼說。

+0

聽起來更像是一個僵局 – 2010-10-20 17:40:05

+1

可能想用sp_who2看看,看看,如果你正在阻止任何人(blkby)會。 http://sqlserverplanet.com/dba/using-sp_who2/ – Jay 2010-10-20 17:44:08

+0

什麼是「DBCC CHECKDB('DB名稱')WITH NO_INFOMSGS」的結果? – TToni 2010-10-20 17:45:03

回答

0

SET ROWCOUNT是否已應用於您的會話?

+2

這並不能解釋爲什麼'選擇TOP 1 ... ORDER BY Created DESC'不起作用。 – 2010-10-20 17:52:42

+0

事實上,更專業的用戶可以打折這種可能性並不會使答案無用。 +1來補償downvote。 – Andomar 2010-10-20 18:25:21

+0

事實上,ROWCOUNT似乎對我來說是一個明智的建議 – smirkingman 2010-10-20 19:58:39

0

SELECT COUNT(*)是否返回任何內容?它是否準確(例如大約200k)?多久時間?

你應該嘗試做一個數據庫的完全備份,然後恢復到一個新的數據庫名稱。之後,看看你是否與恢復的數據庫有相同的問題。

+2

對於這個問題,第一個嫌疑犯肯定會是未提交事務的某個行上的「X」鎖。在這一點上,我不會惹惱恢復備份。 – 2010-10-20 17:54:27

+0

+1這是爲什麼被拒絕?有用和有用的答案;正是我會做什麼 – Andomar 2010-10-20 18:22:44

+0

@Andomar - 查看上/下投票統計我不認爲它實際上是。收回的downvotes存在顯示不更新的問題。 – 2010-10-20 18:27:44

0

DBCC CHECKTABLE可用於檢查單個表及其索引的完整性。

'SET ROWCOUNT'似乎是最可能的罪魁禍首,但可能你不是故意設置它。這個值/設置可能會以某種方式在後臺爲您設置;它可以在SSMS中設置爲適用於所有窗口(工具/選項/查詢執行),甚至適用於當前窗口(查詢/查詢選項/執行)。

存在其他(坦率地說,可笑的)可能性。通過SQL事件探查器跟蹤會話(從登錄到提交的查詢)可能會顯示更多和更細微的信息。

+0

鎖定/阻止是一種選擇。我在BIG表格上沒有這方面的經驗。你有什麼指數?當您的查詢正在運行時,可能會通過其他連接更新它們? – 2010-10-20 17:53:47

0

我會假設一個未提交的事務對至少一個與您的SELECT查詢所需的共享鎖不兼容的行或頁面持有鎖定。

要解決此問題,您可以在一個SSMS窗口中執行您的SELECT ...查詢失敗。

然後在第二個窗口中,第一個查詢仍在執行並被阻止運行the following script

這應該向您顯示有問題的SQL以及足夠的詳細信息以對其進行故障排除。

SELECT Blocking.session_id   AS BlockingSessionId, 
     Sess.login_name    AS BlockingUser, 
     BlockingSQL.text    AS BlockingSQL, 
     Waits.wait_type    WhyBlocked, 
     Blocked.session_id   AS BlockedSessionId, 
     USER_NAME(Blocked.user_id) AS BlockedUser, 
     BlockedSQL.text    AS BlockedSQL, 
     DB_NAME(Blocked.database_id) AS DatabaseName 
FROM sys.dm_exec_connections AS Blocking 
     INNER JOIN sys.dm_exec_requests AS Blocked 
     ON Blocking.session_id = Blocked.blocking_session_id 
     INNER JOIN sys.dm_os_waiting_tasks AS Waits 
     ON Blocked.session_id = Waits.session_id 
     RIGHT OUTER JOIN sys.dm_exec_sessions Sess 
     ON Blocking.session_id = Sess.session_id 
     CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL 
     CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL 
ORDER BY BlockingSessionId, 
      BlockedSessionId 
+0

問他時間,他會給你一個計時碼錶 – smirkingman 2010-10-20 20:07:08

相關問題