首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有经验法则将外键的值包含在表中以避免大连接?

是否有经验法则将外键的值包含在表中以避免大连接?
EN

Database Administration用户
提问于 2016-08-24 09:47:47
回答 3查看 165关注 0票数 0

示例:

我们有一张桌子,桌子上有500排“汽车”。还有一个表“颜色”,它大约有20行。表“汽车”有外键引用表的“颜色”。为了得到汽车的颜色,我们需要在桌子上加入“颜色”:

代码语言:javascript
复制
select car.Name,
color.Name as Color
from dbo.Cars as car
inner join dbo.Colors as color on color.ID = car.ColorID

结果会是这样的:

代码语言:javascript
复制
+-------------+--------+
|    Name     | Color  |
+-------------+--------+
| Rolls Royce | Red    |
+-------------+--------+

但是,假设您有10,000,000行的汽车和2,000,000行的颜色;内部连接会造成相当大的性能损失。最好在表"Cars“中包括列"Color”和"ColorID“,以避免这种内部连接。所以您的查询应该如下所示:

代码语言:javascript
复制
select Name,
Color
from dbo.Cars

当您的表到达x行数量时,是否有经验规则可以将外键值包含在表中?还是最好完全删除外键,只在表"Cars“中设置一个名为"Color”的列,从而导致表中的“颜色”变得多余?

EN

回答 3

Database Administration用户

发布于 2016-08-24 12:05:54

不要去奥米,保留2张桌子(汽车和颜色),不管表的大小。我认为你不需要用一个查询来选择1000万,但是如果你真的需要它,你可以成批地去做。我不知道你的问题,但默认情况下,永远不要去做。

如果您对大表有问题,您可以公开它,但我非常肯定,去正规化将不是解决方案。

票数 1
EN

Database Administration用户

发布于 2016-08-24 13:05:29

但这并不是一个很大的加入

ID只是一个整数

color.ID应该是PK --这是一个非常快速的连接--即使在非常大的表上也是如此。

红色是一种短颜色,它比整数PK / FK占用更多的空间。

通过去正常化,你会使一张大桌子更大。

颜色索引将更大。

经验法则是不要将大桌子去标准化.

票数 1
EN

Database Administration用户

发布于 2016-08-24 14:17:49

在OLTP系统中,应该将它们保存为两个单独的表,并对ID列进行适当的索引。

在数据仓库的星型设计中,将颜色还原到汽车维度是完全合法的。我在这里假设汽车将是一个维度,抑制事实,如旅程或CarSale等。

在从您的OLTP系统导入仓库期间,您的ETL过程将处理去错操作。这通常是通过中间阶段表来完成的。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/147713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档