23

我有一个 6 列的简单表格。大多数情况下,任何插入语句都可以正常工作,但有时我会遇到 DB Timeout 异常:Timeout expired。在操作完成之前超时时间已过或服务器没有响应。该语句已终止。

超时设置为 10 秒。

我应该提到我正在使用 NHibernate,并且该语句还在插入本身之后包含一个“select SCOPE_IDENTITY()”。

我的想法是该表被锁定或其他什么,但当时该表上没有其他语句运行。

所有的插入都非常简单,在 sql profiler 中一切看起来都很正常,表没有索引,只有 PK(页面填充度:98.57 %)。

关于我应该寻找什么的任何想法?

谢谢。

4

6 回答 6

36

我认为你最有可能的罪魁祸首是来自另一个事务的阻塞锁(或者可能来自触发器或幕后的其他东西)。

最简单的判断方法是启动INSERT,当它挂起时,EXEC SP_WHO2在同一服务器上的另一个窗口中运行。这将列出所有当前的数据库活动,并有一个名为的列BLK将显示当前是否有任何进程被阻止。检查SPID挂起的连接以查看BLK列中是否有任何内容,如果有,那就是阻止您的进程。

即使您认为没有任何其他语句正在运行,唯一确定的方法是使用类似的 SP 列出当前事务。

于 2009-01-16T05:50:30.487 回答
29

这个问题似乎是一个代码片段的好地方,我用来查看阻塞和阻塞查询的实际 SQL 文本。

下面的代码片段采用了SP_WHO2返回“.”的约定。BlockedBy用于非阻塞查询的文本,因此它将它们过滤掉并返回剩余查询的 SQL 文本(“受害者”和“罪魁祸首”):

--prepare a table so that we can filter out sp_who2 results
DECLARE @who TABLE(BlockedId INT, 
                   Status VARCHAR(MAX), 
                   LOGIN VARCHAR(MAX), 
                   HostName VARCHAR(MAX), 
                   BlockedById VARCHAR(MAX), 
                   DBName VARCHAR(MAX), 
                   Command VARCHAR(MAX), 
                   CPUTime INT, 
                   DiskIO INT, 
                   LastBatch VARCHAR(MAX), 
                   ProgramName VARCHAR(MAX), 
                   SPID_1 INT, 
                   REQUESTID INT)
INSERT INTO @who EXEC sp_who2

--select the blocked and blocking queries (if any) as SQL text
SELECT 
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedId
        ) query)
    )
) AS 'Blocked Query (Victim)',
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedById
        ) query)
    )
) AS 'Blocking Query (Culprit)'
FROM @who 
WHERE BlockedById != '  .'
于 2011-11-11T14:11:55.077 回答
5

可能是表需要很长时间才能增长。

如果您将表设置为大量增长,并且没有启用即时文件初始化,那么查询肯定会每隔一段时间就会超时。

看看这个烂摊子:MSDN

于 2009-01-16T06:04:35.777 回答
4

当时没有其他语句在该表上运行。

作为事务的一部分,针对其他表运行的语句呢?这可能会在问题表上留下锁。

还要检查当时发生的日志文件或数据文件增长,如果您正在运行 SQL2005,它会显示在 SQL 错误日志中。

于 2009-01-15T18:02:56.717 回答
3

我们的 QA 有一些返回大结果集的 Excel 连接,这些查询因 WaitType 为 ASYNC_NETWORK_IO 而暂停了一段时间。在此期间,所有其他查询都超时,因此特定插入与它无关。

于 2009-01-19T08:51:15.770 回答
1

查看表格的碎片,您可能会因此而出现页面拆分

于 2009-01-15T15:38:29.380 回答