Equi Join的特例

时间:2011-05-09 12:05:28

标签: mysql sql plsql sql-tuning

我遇到了这个使用特殊形式的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调优有关。

这是我发现的: -

  1. 这用于较小的表格。
  2. 不是像正常那样进行索引搜索,而是一次性搜索整个表格。
  3. 但我真的不知道与正常的equi-join有什么区别,而且索引如何影响性能。

    如果有人可以在特定的背景下描述并且让我知道我的发现是否错误,那将是非常有帮助的。感谢您的时间和精力: - )

    列描述

    两个表中的分配状态类型Id都声明为NUMBER(9)

1 个答案:

答案 0 :(得分:3)

杀死小表的索引使用的原因是性能。使用索引执行连接时,需要两个磁盘I / O来读取数据。一个用于读取索引,另一个用于读取完整表中的数据。对于较小的表,读取整个表并执行全表扫描比执行第二个磁盘I / O更快。

这是一个广泛的概括,即使在您的数据库中也可能不时变化。从理论上讲,SQL优化器应该足够智能以识别这种情况,并且即使没有提示也可以在索引查找上使用全表扫描。如果将数据添加到一个或两个表中,它也可能将更快的性能从全表扫描移动到索引查找。

我对调整这些查询的问题是:

  1. 这些表的精确定义是什么,包括平均值的VARCHAR列(如果有)的完整程度?
  2. 每张表中有多少行?
  3. 每天为每个表添加多少行?
  4. 此查询的执行频率是多少次?
  5. 有没有人定时用两个选项查询执行情况,看哪哪个更快?
  6. 我担心的是,这个查询是作为一个聪明的性能增强而编写的,无论是对于早期版本的数据库还是仅仅作为一个聪明的黑客,而没有意识到查询优化器可能做得好或更好。