gpt4 book ai didi

database - 查找次数比较 : foreign key is or is not present

转载 作者:搜寻专家 更新时间:2023-10-30 20:19:42 25 4
gpt4 key购买 nike

一位同事最近向我描述了一个重新构建数据库的计划。新数据库将符合一个简单的 star schema :父表将由一个键和一些上下文信息组成,该键将作为其他表中的外键字段。外键字段可能多次出现在同一个子表中。

伪代码:

TABLE Parent
INT key PRIMARY_KEY
INT foo
...

TABLE Child1
INT key FOREIGN_KEY REFERENCES Parent.key
BLOB bar
...

TABLE Child2
INT key FOREIGN_KEY REFERENCES Parent.key
VARCHAR tar
...

设计背后的动机是简化 Parent 之间的 JOIN。和 Child<n> ,这与以前的模式很复杂。

为了进一步加快 JOIN 的速度,我的同事希望尽量减少 OUTER JOIN 的使用。具体来说,她想通过使用 JOINS 并通过以特定方式维护子表中的数据来模拟 OUTER JOIN:填充所有子表,这样对于每个 keyParent , Child<n> 中至少有一行有了那个key值,即使该行在其他方面充满了 null秒。这样,在 Parent 之间执行的任何 JOIN和 Child<n>key将为每个 key 返回至少一个结果在 Parent ,更多的是外部连接。

抛开以这种方式维护数据是否值得的问题,假设所有 key,这种方法是否比执行 OUTER JOINS 更高效?字段已正确编入索引,大约一半的子行是 null出来了吗?

问题似乎可以归结为“对索引中存在的值进行索引查找比不存在的值更快?”假设索引像 B 树或散列一样运行,我认为答案是“否”,但我所知道的还不足以确定。

最佳答案

就我个人而言,我没有注意到外连接和内连接之间的主要性能差异。为什么您的同事认为他们速度较慢?

添加额外的记录对性能有两个影响。原始数据变得越来越大,需要更多的页面来存储数据。这会对性能产生很大影响,特别是如果额外的页面(没有有用的数据)正在与更有用的结构(比如索引)竞争空间。

第二个影响是对指数的影响。它需要更大,这会导致更深的索引和更多的索引页。这两者都会对性能产生影响。

还有另一个问题,与性能无关。编写查询的用户/开发人员需要充分了解这些空记录的存在。执行 COUNT(*) 或 COUNT() 并期望结果准确反射(reflect)带数据的记录数非常容易。如果不是这种情况,您可能会在以后导致编码问题。

关于database - 查找次数比较 : foreign key is or is not present,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12393596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com