0

我有一个大表 A,它有 PK(C1,C2,C3)和许多其他列,为了使选择更快,使用 PK(C1,C2)创建了一个较小的表 B。所以我们可以通过连接两个表来在 A 中找到一行来进行选择。

但是现在的问题是,如果 B 中的数据损坏导致联合选择什么也不返回,但我们在 A 中仍然有一行,则可能会发生这种情况。

我在这个设计上做错了什么,如何确保这两个表中的数据是一致的?

非常感谢。

4

2 回答 2

3

标准方法 - 如果这些表处于主从关系中 - 是创建一个外键约束,如果存在详细信息,它将防止删除主。

如果您现在可以修复它,那就去做 - 然后创建约束。

如果不能,则使用INITIALLY DEFERRED DEFERRABLE选项创建外键约束,以便不检查当前值,但将来的 DML 会检查。

最后,尽管某些行不再存在,但要获取数据,请使用外连接

于 2019-12-03T11:09:07.140 回答
1

“我是不是对这个设计做错了什么?”

好吧,如果没有有关您的方案的更多详细信息,很难确定,但可能您只需要在A(C1, C2).

尽管我希望看到一些基准测试证明对您的主键索引进行索引范围扫描并不能胜任这项工作。特别是因为似乎表 B 上的连接可能正在使用该访问路径。

Oracle 数据库的性能调优是一个理解和处理许多变量的问题。这不仅仅是“在另一个索引上插入”的情况。我们需要了解数据库实际在做什么以及为什么优化器做出这样的选择。所以,请阅读这篇关于 Oracle 调优问题的文章,这将使您深入了解如何进行查询优化。

于 2019-12-03T12:21:50.097 回答