是否有加入3个或更多表的替代方案?

问题描述:

如下例所示,将三个或更多表连接在一起是否是一个好主意。我正在努力关注性能。有没有什么办法可以重写这个查询,效率更高,执行速度更快?我试图让尽可能简单化。非常感谢您的回答是否有加入3个或更多表的替代方案?

select * from a 
join b on a.id = b.id 
join c on a.id = c.id 
join d on c.id = d.id 
where a.property1 = 50 
    and b.property2 = 4 
    and c.property3 = 9 
    and d.property4 = 'square' 
+0

根据我的小知识,它看起来不错只有.. – 2012-03-27 19:32:53

+0

性能您需要替换'*'只有你需要的列。 – 2012-03-27 19:45:21

表现明智,我认为这取决于每个表中的记录数,并确保您已定义适当的索引。 (我也假设SELECT *是一个占位符;你应该避免通配符)

我首先检查你的执行计划,并开始优化。如果你仍然没有达到最佳性能,你可以尝试使用临时表来将4个表连接拆分成单独的较小连接。

如果你想更快的性能,确保所有参加的都是由一个索引(群集或非群集)覆盖。看起来这可以通过在上面的查询中完成,通过在每个表上创建id和适当的属性列上的索引

+0

投票赞成表现这个重要的一点,初学者像我一样,曾经错过.. :) – 2012-03-27 19:34:33

+0

我不熟悉如何做索引。你能解释更多吗?你能给个例子吗? – dido 2012-03-27 19:56:02

+0

主键是聚集索引的一个示例。小心使用索引,因为它们本质上是数据的副本,可以更快地检索,但如果表中有大量数据,索引将占用大量磁盘空间。这里有一篇关于索引基础的非常好的文章:http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/ – mattytommo 2012-03-27 20:00:26

假设规范化的数据库,就结构化查询而言,这是最好的,加入到位。

还有其他选项可供查看,包括在不同的join和select子句列中添加索引,对表结构进行非规格化并缩小结果集。

在连接列(似乎是主键,因此可能已被编入索引)上添加索引将有助于提高连接性能,对select子句中的列编制索引将有助于加快每个表上的筛选。

如果你反规范化,你会得到一个重复数据的结构,其中包含重复数据的所有含义(主要是数据维护问题),但是当你不再需要连接时,你会获得性能。

选择列时,应指定您想要的列 - 使用*通常是一个坏主意。这样您只能传输应用程序真正需要的数据。

如果您只选择了列的一个子集,那么在选择所有3个表中的所有内容的时刻,您可以更快地完成这项工作。

+0

对,我可以选择一个子集..但我担心的是,这真的是一个好习惯吗?或最佳实践? – dido 2012-03-27 19:53:08

+0

那么,如果你不需要全部3张桌子上的所有东西,这只是一个好习惯。举个例子,你不需要10列,有100万行,这是2000万列数据,你没有检索,因此它会执行得更快:) – mattytommo 2012-03-27 19:58:16