使用SQL INNER JOIN有什么不好的

时间:2010-03-16 00:35:31

标签: sql performance inner-join

每次查看数据库图表时,人们批评的一个领域是内部联接。他们很难看待它们,并且有一些问题需要确定内部连接是否真的需要在那里。

简单库示例:

通常在SQL中使用三个表定义多对多关系:预订类别 BookCategory

在这种情况下,“类别”是一个包含两列的表格: ID CategoryName

在这种情况下,我对类别表有疑问,是否需要?是否可以用作查找表,并在 BookCategory 表中存储 CategoryName 而不是 CategoryID 以阻止必须执行其他操作内部联接。 (对于这个问题,我们将忽略更改,删除任何CategoryNames)

问题是,内连接有什么坏处?在什么时候这样做是负面的事情(一般指导如交易#,记录数,声明中的连接数等)?

5 个答案:

答案 0 :(得分:5)

你的例子是一个很好的反例。如果它们分布在 BookCategory 表的各个行中,您如何重命名类别?您的UPDATE进行重命名会触及同一类别中的所有行。

使用单独的表,您只需更新一行。没有重复的信息。

答案 1 :(得分:3)

我会更关注OUTER加入,以及有可能获取非预期的信息。

在您的示例中,拥有Category表意味着图书仅限于以预设Category(通过foriegn密钥关系)提交,如果您只是将多个条目推送到{ {1}}表格然后更难限制为BookCategory选择的内容。

进行INNER连接并不是那么糟糕,它是为数据库创建的。唯一不好的时候是你在一个索引不充分的桌子或列上做这件事。

答案 2 :(得分:0)

我不确定内连接本身有什么问题,就像你添加到代码中的每个IF影响性能(或者我应该说每一行......),但是,你还需要一个最小数量那些使你的系统工作(是的,我知道图灵机)。 所以,如果你有不需要的东西,那就不赞成了。

答案 3 :(得分:0)

当您将域模型映射到关系模型时,您必须跨多个关系拆分信息以获得规范化模型 - 没有办法解决这个问题。然后你必须使用连接来再次组合关系并获取您的信息。唯一不好的是,连接相对昂贵。

另一种选择是不规范您的关系模型。这将为您的数据库填充大量冗余数据,为您提供许多机会,使您的数据不一致,并使更新成为一场噩梦。

不规范关系模型的唯一理由(我现在可以想到)是阅读表现非常 - 而且我的意思是非常关键。

顺便问一下,为什么你(他们)只提到内联?左,右和全外连接如何与内连接明显不同?

答案 4 :(得分:0)

没有人可以提供更多关于一般指导方针 - 它们特定于服务器,硬件,数据库设计和期望......方式太多变量。

特别关于INNER JOIN效率低下或不好...... JOIN是关系数据库的中心,它们已存在数十年。当你错误地使用它时,这是唯一的错误,因为很明显有人正在做它,因为它还没有灭绝。就我个人而言,我认为任何人都会抛出这样的一揽子陈述,要么就是不知道SQL,要么知道就足以惹麻烦了。下次出现时,请教他们如何使用查询缓存。

(不提及更新/删除,但你没有说插入!:通过避免人类及其拼写错误而增加的可维护性很容易至少是连接时间的10倍。)