我遇到了这个特殊的脚本,它使用了一种特殊的equi连接形式。

SELECT *
FROM
per_assignments a, per_assigment_types b
WHERE
a.assignment_status_type_id + 0  = b.assignment_status_type_id

为什么在equi连接中加零?我开始知道这与避免索引搜索有关系,但还是有人能解释完全相同的情况。提前谢谢
编辑:
它与表/列声明无关。据我所知,这与sql调优有关。
这就是我发现的:
这是用在小桌子上的。
与通常的索引搜索不同,这将一次性搜索整个表。
但是我真的不知道普通equi连接有什么区别,而且索引如何影响性能。
如果有人能在特定的背景下描述,并且让我知道我的发现是否是错误的,那将非常有帮助。同样感谢你的时间和努力:-)
列说明:
两个表中的赋值状态类型id都声明为数字(9)

最佳答案

终止小表的索引使用的原因是性能。使用索引执行联接时,需要两个磁盘I/O才能读取数据。一个用于读取索引,另一个用于从完整表中读取数据。对于较小的表,读取整个表并执行完整表扫描比执行第二个磁盘I/O更快。
这是一个广泛的概括,甚至在您的数据库中也可能会随时间变化。理论上,sql优化器应该足够聪明,能够识别这种情况,并在索引查找上使用完整的表扫描,即使没有提示。如果将数据添加到一个表或两个表中,则可能会将更快的性能从全表扫描移到索引查找。
关于优化这些查询,我有以下问题:
表的精确定义是什么,包括varchar列(如果有的话)平均有多满?
每个表有多少行?
每天向每个表添加多少行?
此查询多久执行一次?
有没有人用这两个选项来计时查询执行,看哪个更快?
我担心的是,这个查询是作为一个聪明的性能增强而编写的,无论是对于早期版本的数据库,还是仅仅作为一个聪明的黑客而编写,而没有意识到查询优化器可能做得同样好或更好。

10-05 19:54