给出超时的简单SQL Delete语句

给出超时的简单SQL Delete语句,sql,sql-server,sql-server-2008,timeout,Sql,Sql Server,Sql Server 2008,Timeout,执行此简单的SQL Delete语句时,SQL Server会超时: DELETE FROM dbo.[User] WHERE Id = 95146 表中约有95000条记录 我想这可能是因为表上的索引,所以我删除了除了主键(Id)之外的所有内容,主键(Id)是集群的,但这没有帮助 我也删除了我创建的所有统计数据,但也没有任何效果 我还可以做些什么来对此进行优化 亲切问候,, 大卫这很奇怪。我猜您有一个ON-DELETE级联外键,它引用了模式中其他地方的Users表。检查您的约束条件: SEL

执行此简单的SQL Delete语句时,SQL Server会超时:

DELETE FROM dbo.[User] WHERE Id = 95146
表中约有95000条记录

我想这可能是因为表上的索引,所以我删除了除了主键(Id)之外的所有内容,主键(Id)是集群的,但这没有帮助

我也删除了我创建的所有统计数据,但也没有任何效果

我还可以做些什么来对此进行优化

亲切问候,,
大卫

这很奇怪。我猜您有一个ON-DELETE级联外键,它引用了模式中其他地方的Users表。检查您的约束条件:

SELECT f.name AS ForeignKey,
    OBJECT_NAME(f.parent_object_id) AS TableName,
    COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
    COL_NAME(fc.referenced_object_id,
    fc.referenced_column_id) AS ReferenceColumnName,
    f.delete_referential_action_desc
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id

有多少外键引用了
用户
Id
列,这些列上有索引吗


如果cascade设置为
NO_ACTION
,正如您所指出的,SQL Server可能需要花费时间对这些表中的每个表执行完整的表扫描,以确保没有对
Id
95146的引用-我以前看到这很容易就需要几分钟,如果其他表很大。

在语句运行时,请查看系统执行的运行任务和锁定列表。您可以从活动监视器获取此信息,也可以在视图中查看正在运行的任务,并使用和锁定

另外,在SQLServerManagementStudio中,输入此语句并查看估计的执行计划。也许您可以看到SQL Server正在尝试做什么


请查看此表的外键。您可能需要在其他表上添加一些索引以优化外键断言。

除了其他响应之外,可能您的删除被其他活动阻止(请查看您的spid在sp_who2的BlkBy列中是否有任何值),或者可能表上有一个触发器正在执行不正常的操作。提到的大多数事情都会减慢删除速度,但除了非常复杂的情况外,还不足以引起超时。

我当时正在努力处理一个
delete
语句,该语句导致我们的ERP(Epicor 10)系统在夜间运行MRP时超时。这是一个包含几个联接的删除,联接中涉及的一个表相当大。奇怪的是,如果我为同一个join/where子句将delete转换为一个
SELECT*
,那么查询将立即完成,结果为零(即delete语句显然正在进行一些长的、大的表扫描,但实际上没有找到任何要删除的内容)


最后的帮助是,我运行了selectstatment版本,并启用了showtreactexecutionplan,这有一个建议的非唯一索引要添加到其中一个表中。添加此索引后,select语句仍然立即运行,但现在delete语句也运行了

我确实有外键引用,但运行上面的操作会显示它们在delete\u reference\u ACTION\u desc列中没有任何操作。它们不需要层叠来引起问题-需要检查外键列的每个值是否不包含要删除的值,因此,如果该列上没有索引,那么将进行表扫描。好的,我理解。我会仔细检查,实际上有20个外键指向用户id,所以我认为这就是问题所在。我将通过这些检查索引。好的,这就是原因。在为这些外键添加索引后,超时消失了。感谢您的帮助。请标记和/或指定您正在使用的SQL Server版本。这些信息总是很有用的,因为解决问题的某些方法可能适用于某些版本,也可能不适用于某些版本。