我遇到了这个使用特殊形式的equi join的特殊脚本。
SELECT *
FROM
per_assignments a, per_assigment_types b
WHERE
a.assignment_status_type_id + 0 = b.assignment_status_type_id
为什么在equi连接中添加了零?我开始知道它与避免索引搜索有关,但仍然可以解释相同的完整图片。提前致谢
修改:
这不是与表/列声明相关的东西。据我所知,它与SQL调优有关。
这是我发现的: -
但我真的不知道与正常的equi-join有什么区别,而且索引如何影响性能。
如果有人可以在特定的背景下描述并且让我知道我的发现是否错误,那将是非常有帮助的。感谢您的时间和精力: - )
列描述:
两个表中的分配状态类型Id都声明为NUMBER(9)
答案 0 :(得分:3)
杀死小表的索引使用的原因是性能。使用索引执行连接时,需要两个磁盘I / O来读取数据。一个用于读取索引,另一个用于读取完整表中的数据。对于较小的表,读取整个表并执行全表扫描比执行第二个磁盘I / O更快。
这是一个广泛的概括,即使在您的数据库中也可能不时变化。从理论上讲,SQL优化器应该足够智能以识别这种情况,并且即使没有提示也可以在索引查找上使用全表扫描。如果将数据添加到一个或两个表中,它也可能将更快的性能从全表扫描移动到索引查找。
我对调整这些查询的问题是:
我担心的是,这个查询是作为一个聪明的性能增强而编写的,无论是对于早期版本的数据库还是仅仅作为一个聪明的黑客,而没有意识到查询优化器可能做得好或更好。