SQL查询优化器

时间:2015-02-02 15:34:23

标签: sql oracle optimization

我无法理解任何事情。我有Oracle 11g数据库,有很多数据和表。我想加入一些表并输出结果。 好的,刚刚写道:

SELECT *
FROM Table1
LEFT JOIN Table2 ON Table2.Table1_Id = Table1.Table1_Id
WHERE Table2.Column1=1
  • 非常简单,但速度太慢。 好的,Table2与Table3相关联。该表在列中包含一些标志,可以告诉我们,它通常与Table1连接。 我写了下一段代码:

    SELECT *
    FROM Table1
    LEFT JOIN Table2 ON Table2.Table1_Id = Table1.Table1_Id
    LEFT JOIN Table3 ON Table3.Table3_Id = Table2_Table3_Id
    WHERE
    Table3.ColumnWithFlag LIKE '%some id info about Table1%'
    AND Table2.Column1=1
    

这个查询的成本低,比第一次查询快。为什么,我无法理解?我在查询中使用了3个表,它运行得更快,然后用2个表查询(rowcount相同,数据相同)。

1 个答案:

答案 0 :(得分:2)

首先,一些基础知识。这是您的第一个查询:

SELECT *
FROM Table1 t1 LEFT JOIN
     Table2 t2 
     ON t2.Table1_Id = t1.Table1_Id
WHERE t2.Column1 = 1;

LEFT JOIN是不必要的,因为WHERE子句无论如何都会将其转换为INNER JOIN。如果没有匹配项,则t2.Column1NULL并且会被过滤掉。

我可以想象至少有一种方法可以看到这个性能问题。基本上,如果Table2Table1_Id上没有索引但在Table3_Id上有索引。

在这种情况下,第一个查询计划需要扫描Table2(可能使用Column1上的索引),然后执行数据库魔术 - 可能是表上的散列连接。

第二个查询将使用可用索引加入Table2Table3。这可能(大概)比Table2小得多。数据库魔法可以省去一张非常大的表的全表扫描。

这是一种可能的情况。真正的方法是查看查询的执行计划,看看有什么不同。