Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server 2008更新查询花费了太多时间_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql Server 2008更新查询花费了太多时间

Sql Server 2008更新查询花费了太多时间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个带有372370记录的表名companys 并且只有一行具有CustomerNo='YP20324' 我看到一个正在运行的查询,它花费了我太多的时间,我等了5分钟,它仍然在运行。我想不出问题出在哪里 UPDATE Companies SET UserDefined3 = 'Unzustellbar 13.08.2012' WHERE CustomerNo = 'YP20324' 370k记录对于sql Server来说不算什么。您应该检查此表上的索引。每个索引使更新操作变得更长。370

我有一个带有
372370
记录的表名
companys

并且只有一行具有
CustomerNo='YP20324'

我看到一个正在运行的查询,它花费了我太多的时间,我等了5分钟,它仍然在运行。我想不出问题出在哪里

UPDATE Companies SET UserDefined3 = 'Unzustellbar 13.08.2012' WHERE CustomerNo = 'YP20324'

370k记录对于sql Server来说不算什么。您应该检查此表上的索引。每个索引使更新操作变得更长。

370k记录对于sql Server来说不算什么。您应该检查此表上的索引。每个索引都会延长更新操作。

尝试在您的
WHERE
子句中使用的字段上添加索引:

CREATE INDEX ix_CompaniesCustomerNo ON Companies(CustomerNo);

还要检查是否有其他活动查询可能阻止更新。

尝试在您的
WHERE
子句中使用的字段上添加索引:

CREATE INDEX ix_CompaniesCustomerNo ON Companies(CustomerNo);

还要检查是否有其他活动查询可能会阻止更新。

该表上没有更新触发器吗? 是否有基于该列的级联外键

您确定服务器的性能吗?执行查询时,请先查看内存,cpu(例如,在640mb的386上,我可以理解它的速度很慢:p)


对于锁,您可以右键单击数据库,在报告中可以看到阻塞事务。有时它有助于并发访问。

您在该表上没有更新触发器吗? 是否有基于该列的级联外键

您确定服务器的性能吗?执行查询时,请先查看内存,cpu(例如,在640mb的386上,我可以理解它的速度很慢:p)


对于锁,您可以右键单击数据库,在报告中可以看到阻塞事务。有时它有助于并发访问。

很可能您的更新没有做任何事情,只是在等待,被其他语句阻止。用于调查导致阻塞的原因。很可能是另一条语句启动了事务,而您忘记了关闭它

也可能有其他原因,例如数据库/日志增长。只有你能做调查。
CustomerNo
上的索引是必需的,没错,但缺少索引不太可能解释370k记录上的5分钟。阻塞的可能性更大


还有更高级的工具,比如。

很可能你的更新没有做任何事情,只是在等待,被其他语句阻止。用于调查导致阻塞的原因。很可能是另一条语句启动了事务,而您忘记了关闭它

也可能有其他原因,例如数据库/日志增长。只有你能做调查。
CustomerNo
上的索引是必需的,没错,但缺少索引不太可能解释370k记录上的5分钟。阻塞的可能性更大


还有更多的高级工具,如。

试试这个SQL,看看运行的是什么:

SELECT TOP 20
        R.session_id, R.status, R.start_time, R.command, Q.text
FROM
        sys.dm_exec_requests R
        CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) Q
WHERE R.status in ('runnable')
ORDER BY R.start_time
更多详情: 或


有一次我发现有人正在缩小数据库并阻止所有其他人。

尝试此SQL并查看运行的内容:

SELECT TOP 20
        R.session_id, R.status, R.start_time, R.command, Q.text
FROM
        sys.dm_exec_requests R
        CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) Q
WHERE R.status in ('runnable')
ORDER BY R.start_time
更多详情: 或


有一次,我发现有人正在缩小数据库并阻止所有其他人。

5mn对于370k行来说太长了,即使没有任何索引,其他人也在锁定你的更新。使用
sp_who2
(或活动监视器)并检查BlockedBy列以查找谁正在锁定您的更新

5mn对于370k行来说太长了,即使没有任何索引,也有人正在锁定您的更新。使用
sp_who2
(或活动监视器)并检查BlockedBy列以查找谁正在锁定您的更新

我建议重建您的索引。这肯定对你有帮助


如果在CustomerNo字段上没有索引,则必须添加一个。

我建议重建索引。这肯定对你有帮助


如果在CustomerNo字段上没有索引,则必须添加一个。

在我的情况下,有一个进程阻止了更新; 运行:“EXEC sp_who;” 通过检查“blk”列查找被阻止的流程;假设我们发现一个进程被'73'阻止;
检查“spid”列为“73”的记录,如果不重要,则运行“kill 73”

在我的例子中,有一个进程阻止了更新; 运行:“EXEC sp_who;” 通过检查“blk”列查找被阻止的流程;假设我们发现一个进程被'73'阻止;
检查“spid”列为“73”的记录,如果不重要,则运行“kill 73”

索引呢?“372370条记录”-这是一个非常小的数字…检查表上的锁。尝试使用相同的
WHERE
子句执行
SELECT
,看看需要多少时间。当我使用相同的WHERE子句执行SELECT时,所需时间不到一秒钟。索引如何??“372370记录”-这是一个非常小的数字…检查表上的锁。试着用相同的
WHERE
子句执行
SELECT
,看看需要多长时间。当我用相同的WHERE子句执行SELECT时,所需时间不到一秒钟。你应该澄清“每个索引使更新操作变长”的意思;在这种情况下,
WHERE
子句中使用的字段索引将大大加快更新速度。如果由于字段已更改而需要更新多个索引,则可能会减慢
插入
更新
的速度,但不会太慢,并且仅在批量加载多行时才会如此。您应该澄清“每个索引使更新操作变长”的含义;在这种情况下,
WHERE
子句中使用的字段索引将大大加快更新速度。如果由于字段已更改而有许多索引要更新,则这可能会减慢
插入
更新
的速度,但不会太慢,而且仅当批量加载多行时。