【问题标题】:How to Speed UP the Effects of Foreign Keys如何加快外键的效果
【发布时间】:2011-03-30 00:53:09
【问题描述】:

我们有一个非常规范化的数据库。当我添加和删除具有大量数据的表的外键的数据时,它需要永远删除记录,更不用说来自它的锁了。我该怎么做才能使外键仍然可用但不影响我对数据库的批量插入和删除的性能。所有外键都被索引。

基本上,外键会显着减慢我的批量数据方案。我们的客户每天导入数十万条记录,我们也每天删除大量数据。外键提供数据完整性,但同时显着降低这些过程的速度。

有没有办法回避规范化架构的副作用? 您是如何解决这些相同问题的?

我使用的是 SQL Server 2005。

【问题讨论】:

  • @james xu 那是我目前的思维方式,但我正在努力变得更聪明,并听取其他人的想法。这不一定是正确的方式..

标签: sql sql-server-2005 foreign-keys


【解决方案1】:

您没有提供足够的信息来说明您尝试使用数据库解决的问题。

在我看来,问题不在于外键,而在于它们不是静态的和/或您正在级联删除。

插入可能需要规范化和分阶段加载,以便在具有引用它们的外键的行之前加载主键行,因此还有一些工作要做。有时可以使用分区或计划批处理来改进删除(用于范围清除),并在生产期间使用软删除。

所以问题是 - 为什么您的数据会如此频繁地搅动?你的具体使用场景是什么?并且是一个标准化的模型对此有好处。通常在 OLTP 环境中,数据是不断增加和更新的。 INSERT 通常不会进行大量阻塞,而 DELETE 只会阻塞对删除中涉及的相同数据实体的操作(因此您希望它们被阻塞)。在定期加载和卸载数据以进行分析的 OLAP 环境中,关系模型并不总是那么好,因此维度模型可能更合适,因为加载/卸载通常不会在不同时间段之间阻塞。

【讨论】:

  • 凯德,你的回复可能有点过头了,或者我的 jargan 不是最新的。回答您的问题.. 删除不是级联的。我们是一个 LOB 应用程序。我们从许多其他合作伙伴计划中导入数据,而且数据量通常很大。因此,如果某些内容被删除,无论是因为客户端想要进行巨大更改还是加载新数据。当外键检查启动时,一切都变得慢得多..解释软删除..这是否更像是一种最佳实践而不是 sql server 的功能?
  • @Rico 你对巨大的定义是什么?您是否查看过删除的执行计划以了解它们为什么很慢?软删除是指该行只有一个 IsDeleted 列。这些行通常会在下班时间被批量忽略和删除(或者根本没有真正从表中删除)。也可以为大型操作删除并重新创建 FK 约束。请注意,如果您的删除使数据处于无效状态(在 FK CONSTRAINT 到位时不可能),则肯定有可能无法重新创建 FK。
  • @Rico 通常,我从您使用尽可能多的约束的观点开始 - 外键、列、行、UNIQUE、NOT NULL 等。稍后这些可以放宽,但它非常没有约束就更难开始,发现问题蔓延,然后必须在约束甚至可以应用之前清理数据。在放弃约束之前,我想知道它们为什么会影响性能。是否存在索引问题?是否存在聚类问题?是否存在某种锁升级?
  • 好吧,如果可以的话,我们的一些数据是分层的、分类的。因此,假设一个表有 1000 条记录,其子表中有 120 万条记录。然后还有第三张表,其中有多个指向第二张表的指针。该场景的一个示例是,我昨晚需要从表 2 中删除 3500 条记录,7 小时后删除仍然无效。我将如何加快这个外键场景的速度?为我指明正确的方向.. 我能想到的唯一方法是禁用约束执行删除然后启用约束..
  • @Rico 你能发布一个架构(包括索引)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多