我们有一个非常规范化的数据库。当我向具有大量数据的表添加和删除具有外键的数据时,FOREVER需要删除记录,更不用说来自它的锁。我能做些什么,以便外键仍然可用,但不影响我的批量插入和删除数据库的性能。所有外键都被编入索引。
基本上,外键显着减慢了我的批量数据方案。我们的客户每天导入数十万条记录,我们每天也会删除大量数据。外键提供数据完整性,但同时显着降低了这些进程的速度。
有没有办法回避标准化架构的副作用? 你是如何解决这些相同问题的?
我正在使用SQL Server 2005。
答案 0 :(得分:2)
您没有提供有关您尝试使用数据库解决的问题的足够信息。
对我来说,问题不是外键,而是它们不是静态的和/或你是级联删除。
插入可能需要规范化和分阶段加载,以便在使用引用它们的外键的行之前加载主键行,因此还有一些工作要做。删除(对于范围清除)有时可以使用分区或计划批次进行改进,并在生产期间使用软删除。
所以问题是 - 为什么你的数据如此多?您的具体使用方案是什么?并且是一个有利于此的标准化模型。通常在OLTP环境中,数据会增加和更新。 INSERT通常不会进行大量阻塞,DELETE只会阻止对删除中涉及的相同数据实体的操作(因此您希望它们被阻止)。在定期加载和卸载数据以进行分析的OLAP环境中,关系模型并不总是那么好,因此维度模型可能更合适,因为事实加载/卸载通常不会在不同时间段之间阻塞。