1

想象一个跟踪客户之间付款的数据库。

假设我有一个 Customer 表:

Customer 
----------
CustomerID
Name

和一个事务表

Transaction
------------
BuyerID
SellerID
Amount

其中 BuyerID 和 SellerID 都是对 Customer 表的 CustomerID 列的外键引用。

在我当前(类似)的情况下,事务表很大(5 亿行),尽管客户表很小(2000 行)。但是,从 Customer 表中删除一行需要很长时间,因为数据库必须扫描 Transaction 表以查看 Customer 是否有任何引用 Transactions(实际上,它必须执行两次 - 一次检查 BuyerID一个用于卖方 ID)。Transaction 表未在 BuyerID 或 SellerID 上编制索引(真实表在买方、卖方和其他一些列的组合上编制索引)

我知道我可以删除所有外键约束,删除行,然后重新添加约束。这会比仅DELETE FROM启用外键更快吗?有没有其他方法可以加快我缺少的删除操作。

4

4 回答 4

4

你应该索引BuyerIDSellerID在你的Transaction表中......

要进一步解释为什么应该索引外键,请阅读 Kimberly Tripp 关于该主题的优秀文章

于 2012-04-03T20:31:01.653 回答
1

继续添加额外的两个索引。不理会约束。

于 2012-04-03T20:29:59.293 回答
1

一般来说,如果我有客户的销售交易,我不想删除它们或客户。这正是您具有外键约束的原因,因此您不会删除客户。那只是弄乱了您的财务报告(为什么 2011 年的销售额突然下降了 20%,哦,我们从数据库中删除了一些记录,这不是一个好的对话。)。在这种情况下,您想要的是让客户不活动而不是通常删除它们。

鉴于 Ryan 说这是一个开发中的数据库,而不是生产中的数据库,其他人可能会同时向其中输入数据,我会删除 FK,将我打算删除的客户 ID 放入工作表中,然后执行对父表和所有子表的删除。这样你可以根据需要从5亿行的表中批量删除。然后,当你完成后,重新打开 FK。

于 2012-04-03T20:40:29.123 回答
0

如果我正在处理 5 亿行,我要做的第一件事是 - 删除外键引用并集中存储过程之类的地方来控制删除功能。

于 2012-04-03T20:27:32.717 回答