【问题标题】:Do SQL constraints cause slowness?SQL 约束会导致运行缓慢吗?
【发布时间】:2011-09-27 18:17:46
【问题描述】:

我对正在更新的表有一些约束(默认列的值)。更新真的很慢,不知道是不是约束问题?

有问题的约束是:

ALTER TABLE [dbo].[OrderCustomers] ADD  CONSTRAINT [DF_OrderCustomers_AmountTotal]  DEFAULT ((0.00)) FOR [AmountTotal]

更新语句只是更改了几列,其中之一是上面约束中的列和其他一些没有 F​​K 的列。

仅供参考:我禁用了所有触发器以隔离问题。

【问题讨论】:

  • 您能否提供一些有关约束定义以及更新语句本身的详细信息。
  • SQL 性能就像天气一样——涉及大约十亿个因素,如果没有大量信息,就不可能给出任何见解。你基本上是在问“这里会因为风而热吗?”
  • 列的默认值?不太可能,除非该默认值的计算成本很高。我们能看到约束吗?
  • 默认值不是约束。
  • @Larry Lustig:值得商榷。当没有提供值时,它将值限制为 NOT NULL 例如 SomeCol int NOT NULL CONSTRAINT DF_Table_SomeCol DEFAULT 0

标签: sql sql-server constraints


【解决方案1】:

列上的默认约束不太可能会引起注意。有很多事情可能会导致更新缓慢。但是,我首先要看的是正在更新的表上的任何触发器。这可能会导致一系列性能问题。

诊断此问题的最佳方法之一是启动 SQL Profiler 并查看执行更新时 SQL Server 上发生的情况。您可能会对正在发生的事情感到非常惊讶。

【讨论】:

  • +1 因为有勇气回答一个信息很少的问题,但很有可能是正确的。我喜欢那样做,希望我再这样做一次:)
  • +1 几乎肯定是正确的。默认值会减慢任何速度的可能性很小。但是,如果有人决定在触发器中添加wait 3 seconds(我是认真的)或select from my table but don't bother with indexes,那么这就是原因。
【解决方案2】:

除非你对它们进行了非常糟糕的编码,否则不会。

说得不好,我的意思是像 UDF 这样访问表以生成值的东西。或者在触发器中发送电子邮件 RBAR。

写入缓慢可能是由许多原因造成的。我怀疑约束。见Why does an UPDATE take much longer than a SELECT?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多