简单的SQL查询未完成[关闭]


8

我还不太了解如何提出这个问题,因为我们还不了解,但是我想提早提出,因为这看起来像是不容忽视的事情。

本周,我们开始遇到数据库服务器的问题。它似乎是一个数据一致性问题,甚至在非常简单的查询和小型表上也通过超时来体现。我们通过在本周早些时候重新启动服务器来“解决”该问题,但该问题消失了,但是现在看来它又回来了,这次是在更关键的表上。例如,我刚刚进行了一些调查,并且正在查看这样的查询:

SELECT * FROM table WHERE id = 1234

特定的ID。该表有大约30+百万行。但是,似乎只有一小部分记录会发生这种情况。我敢打赌,当我重新启动服务器或备份并在另一台服务器上还原数据库时,一切都会好的。但是我会努力的。

此时,我正在运行:

DBCC CHECKTABLE ('table', NOINDEX)

但似乎它将永远持续下去。当我们第一次遇到问题时,我检查了违规表,一切都很好。这个新桌子更大了。

一些背景技术信息:

  • SQL Server 2008 R2,Windows Server 2008 R2
  • AWS / EC2,m2.2xlarge,32 GB RAM,4 x 1TB RAID 0
  • 几乎没有磁盘IO,似乎大多数数据库都在内存中
  • 总数据库大小:100GB

ELB卷是“全新的”。我们本周创建了它们。

编辑:我只是使用以下命令:

SELECT
    sqltext.TEXT,
    req.session_id,
    req.blocking_session_id,
    req.wait_type,
    req.wait_time,
    req.last_wait_type,
    req.wait_resource,
    req.open_transaction_count,
    req.transaction_id,
    req.total_elapsed_time
FROM
    sys.dm_exec_requests req
CROSS APPLY
    sys.dm_exec_sql_text(req.sql_handle) AS sqltext

并发现我的查询它正在等待共享锁(LCK_M_S),其中阻止会话正在等待由不存在的会话阻止的另一个共享锁。

编辑2:好的,该会话存在(我使用找到了它sys.dm_exec_sessions),但现在似乎什么也没做。

编辑3:我找不到有关该会话的任何有趣信息。我看到它来自什么Web服务器,但是没有太多其他信息。

编辑4:编辑4:我们在代码中发现了一个可能的错误:该函数不能确保关闭数据库连接。另一方面,看起来该函数正在使用的事务已被正确处理,在这种情况下,所有锁应已清除。对我来说还不是很清楚,但这似乎是可能的原因。我们将修复该错误并留意该错误。

Answers:


4

对我来说,这个问题是由在调试模式下暂停的Visual Studio打开的数据库连接引起的。停止调试过程将使查询立即完成。


2

挂起查询时的等待类型是什么?这将确切告诉您它正在等待什么。遇到问题时,请在服务器上查找并安装sp_whoisactive并运行存储过程。这将向您显示spid,并为您提供等待类型。

奇怪的是,您被某人写入该行或该页面上的另一行所阻止,或者正在等待磁盘响应。


0

尝试DBCC CHECKDB在问题数据库上运行并等待其完成。如果存在导致这种奇怪行为的物理数据不一致,那么使用该数据库太危险了,因为您可能会丢失所有数据。

  1. 尽快进行备份。
  2. 检查数据库。

如果表中的BLOB列具有相对大量的数据,则对照该表进行检查应该花费很长时间是绝对正常的。


0

我不确定自己希望得到什么答案,但是如果该表有30+百万行,则它预期DBCC命令会运行很长时间。

当你说:

但是,似乎只有一小部分记录会发生这种情况

您的意思是您担心整个表没有被扫描?如果您在ID上有索引,这是正常的,则将扫描索引,这将导致读取次数减少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.