我遇到了这个特殊的脚本,该脚本使用一种特殊的均等连接形式.
SELECT *
FROM
per_assignments a, per_assigment_types b
WHERE
a.assignment_status_type_id + 0 = b.assignment_status_type_id
为什么在等额联接中添加零?我知道它与避免索引搜索有关,但是仍然可以有人解释它的完整情况.提前致谢
编辑:
这与Table / Column声明无关.据我所知,这与SQL调优有关.
这是我发现的:
>在较小的表中使用.
>与其像通常那样进行索引搜索,不如一次搜索整个表.
但是我真的不知道与普通的等联接有什么区别,此外,索引如何影响性能.
如果有人可以在特定的背景下进行描述,并且让我知道我的发现是否错误,那将真的很有帮助.赞赏您的时间和精力:-)
栏说明:
两个表中的分配状态类型Id都声明为NUMBER(9)
解决方法:
终止小型表索引使用的原因是性能.使用索引执行联接时,需要两个磁盘I / O来读取数据.一个读取索引,第二个从完整表读取数据.对于较小的表,读取整个表并执行全表扫描比执行第二个磁盘I / O更快.
这是一个广义的概括,甚至在您的数据库中可能会不时变化.从理论上讲,SQL优化器应该足够聪明,可以识别这种情况,甚至可以在没有提示的情况下对索引查找使用全表扫描.如果将数据添加到一个或两个表中,也可能使更快的性能从全表扫描转移到索引查找.
我对调整这些查询的疑问是:
>这些表的确切定义是什么,包括VARCHAR列(如果有)的平均填充量是多少?
>每个表中有几行?
>每天向每个表添加多少行?
>该查询多久执行一次?
>是否有人定时使用两个选项查询执行时间,以查看哪个更快?
我担心的是,此查询被编写为针对数据库的早期版本进行了巧妙的性能增强,或者只是作为未意识到查询优化器可能会做得更好或做得更好的聪明技巧.