2010-10-20 36 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