哪个SQL查询更有效?

时间:2011-04-23 15:19:59

标签: sql oracle10g

这两个查询中的哪一个更有效?

  1. SELECT *FROM Emp WHERE DeptNo<>20

  2. SELECT *FROM Emp WHERE NOT Deptno=20

  3. 我的教练告诉我第一个更有效率,我理解其中的原因但是如何使用Oracle 10g进行检查?他使用了一些命令来显示消耗的CPU周期,但在Google搜索后我找不到它们。

    使用AUTOTRACE的输出是相同的。

    SQL> SELECT *FROM Emp
        WHERE DeptNo<>20
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=9 Bytes=333
              )
    
       1    0   TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=9 Bytes=
              333)
    Statistics
    ----------------------------------------------------------
              1  recursive calls
              0  db block gets
              8  consistent gets
              0  physical reads
              0  redo size
           1125  bytes sent via SQL*Net to client
            508  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              9  rows processed
    
    SQL> SELECT *FROM Emp
    WHERE NOT Deptno=20
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=9 Bytes=333
              )
    
       1    0   TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=9 Bytes=
              333)
    
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              8  consistent gets
              0  physical reads
              0  redo size
           1125  bytes sent via SQL*Net to client
            508  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              9  rows processed
    

3 个答案:

答案 0 :(得分:4)

从统计数据来看,它们看起来都是平等的。但有几个提示:

  • 请勿使用select *,只选择您需要的字段
  • 确保已正确设置索引

答案 1 :(得分:1)

在oracle中,这两个都将以相同的方式处理。在解析(=细分)查询时会出现任何差异,如果查询运行多次,即使这样也会有所不同,因为解析结果是缓存的。

将效率工作集中在更低效的流程上,例如:加入和子查询。

答案 2 :(得分:1)

AUTOTRACE告诉你,在这种情况下,查询的执行方式完全相同,因此两者都不比另一个好。两者都涉及全表扫描。数据库可以非常智能地进行优化。 Oracle可能花费1纳秒来减少<>版本的查询计划。

您的培训师可能尝试制作的一般要点涉及何时可以使用索引,何时不能。因此,带有IN的SELECT可能比带有NOT IN的SELECT运行得更快,因为DB更有可能使用索引搜索前者。