【问题标题】:Sql Server 2008 Update query is taking so much timeSql Server 2008 更新查询花费了很多时间
【发布时间】:2013-11-29 09:23:04
【问题描述】:

我有一个表名 Companies372370 记录。

只有一行有CustomerNo = 'YP20324'

我正在运行以下查询,它花费了很长时间,我等了 5 分钟,它仍在运行。我无法弄清楚问题出在哪里。

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

【问题讨论】:

  • 索引呢??
  • “372370 条记录。” - 这是一个非常小的数字......
  • 检查桌子上的锁。尝试使用相同的WHERE 子句执行SELECT,看看需要多少时间。
  • 当我使用相同的 WHERE 子句执行 SELECT 时,只需不到一秒钟。

标签: sql sql-server sql-server-2008


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    CREATE INDEX ix_CompaniesCustomerNo ON Companies(CustomerNo);
    

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

    【讨论】:

      【解决方案3】:

      试试这个 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
      

      更多详情: List the queries running on SQL Server 或者 http://sqlhint.com/sqlserver/scripts/tsql/list-long-running-queries

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

      【讨论】:

        【解决方案4】:

        您的 UPDATE 很可能没有做任何事情,只是在等待,被其他语句阻塞。使用Activity Monitor 调查导致阻塞的原因。很可能您有另一个语句启动了事务,但您忘记了关闭它。

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

        还有更高级的工具,例如 sp_whoisactive

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              就我而言,有一个进程阻止了更新; 运行:'EXEC sp_who;' 通过检查'blk'列找到被阻塞的进程;假设我们找到了一个被“73”阻塞的进程; 检查列 'spid' = '73' 的记录,如果不重要,运行 'kill 73';

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                • 您应该澄清“每个索引使更新操作更长”的意思;在这种情况下,WHERE 子句中使用的字段的索引将大大加快更新速度。如果由于字段已更改而需要更新许多索引,那可能会减慢 INSERTUPDATE 的速度,但不会很慢,并且仅在批量加载许多行时才会发生。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-06-04
                • 1970-01-01
                • 2017-08-04
                • 1970-01-01
                • 1970-01-01
                • 2013-07-11
                • 1970-01-01
                相关资源
                最近更新 更多