当前位置:  开发笔记 > 数据库 > 正文

SQL Server简单的Insert语句超时

如何解决《SQLServer简单的Insert语句超时》经验,为你挑选了3个好方法。

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

超时设置为10秒.

我应该提一下,我正在使用NHibernate,并且该语句在插入本身之后也包含"select SCOPE_IDENTITY()".

我的想法是桌子被锁定了什么,但当时桌子上没有其他语句在运行.

所有插入都非常简单,在sql profiler中一切看起来都很正常,表没有索引但是PK(页面丰满度:98.57%).

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

谢谢.



1> SqlRyan..:

我认为你最可能的罪魁祸首是来自另一个交易的阻止锁定(或者可能来自触发器或幕后的其他事件).

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

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



2> andreister..:

这个问题似乎是一个代码片段的好地方,我曾经看到过阻塞和阻塞查询的实际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 != '  .'



3> 小智..:

可能是桌子需要很长时间才能成长.

如果您将表设置为大量增长,并且未启用即时文件初始化,则查询肯定会偶尔超时.

检查一下这个烂摊子:MSDN

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有