目前我在sp中使用了很多内连接(大约7个),它对sp性能有什么影响。左外连接比内连接提供更好的性能。
如果我正在连接两个具有列id和id1的表a和b,这两个r都不可为空,那么还有一件事。我想在这里我可以进行内连接,因为这些列被索引。
答案 0 :(得分:10)
外连接比内连接更昂贵。我要说的是对许多人来说会引起争议。如果你正确调整数据库,如果你没有做任何愚蠢的事情,如果你使用专业的力量RDBMS,那么7个内部连接应该不是问题。
数据库调优是什么意思?数据库调优有很多,但要检查的最明显的事情是确保始终连接已编制索引的列。
高飞是什么意思?不要在连接条件中使用OR运算符。尝试将连接保持在单个比较上,例如一个表中的外键等于另一个表中的主键。尝试将所有关键字段保存为整数。
如果遇到性能问题,请务必研究违规查询的执行计划。例如,在加入非常大的表时可能会遇到问题,即使索引扫描太慢也会很大。您可能必须进行非规范化并提供额外的过滤以减少扫描时间。不要试图预料到这一点。非规范化最好几乎不会在你遇到真实世界的表现情况之后完成。
答案 1 :(得分:3)
JOIN用于特定目的&不是为了表现。
LEFT OUTER JOIN用于包含记录,右边的表中没有匹配的记录。 INNER JOIN在两个表格中根据某些标准选择匹配的记录。
答案 2 :(得分:1)
左连接提供与内连接不同的结果,因此不应用作替代。很可能它是您需要的索引。虽然在定义主键时会自动创建索引,但在定义外键时不会创建索引。因此,如果您尚未将连接中的所有外键都编入索引,则需要将其编入索引。
同时检查执行计划以查看问题所在。
有关如何优化查询性能的更具体建议,您需要向我们展示。
答案 3 :(得分:1)
连接通常很昂贵的原因是连接可能会导致许多元组大于任何一个表的大小。
但是,有时一个表中的join属性在功能上确定另一个表中的唯一元组。在这种情况下,join可以非常便宜(但您需要索引这些属性)。
无论您使用多少联接,这都是一种廉价的操作 - 这更多是数据和数据依赖性的问题。
由于您正在加入2个密钥,看起来两个表使用相同的密钥,无论您使用何种类型的连接,这都应该是一个便宜的操作。
答案 4 :(得分:0)
答案 5 :(得分:0)
要跟进Glenn said,如果你加入了“愚蠢的东西”,那么事先将其提取到临时表中也可能有所帮助。
在我过去工作的一个数据库中,连接是在一个部分密钥上(表有复合键,即其中有许多列的主键),并且在where子句中进行了额外的过滤。 where子句中的过滤将在连接的一侧从几十亿到几千来查看行集。加入数千行的表格要比数十亿行容易得多。我记得,查询时间从20分钟缩短到7秒。
另请注意,我们也有子查询和UDF(用户定义的函数) - 这可能会增加愚蠢。