这两个查询中的哪一个更有效?
SELECT *FROM Emp
WHERE DeptNo<>20
SELECT *FROM Emp
WHERE NOT Deptno=20
我的教练告诉我第一个更有效率,我理解其中的原因但是如何使用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
答案 0 :(得分:4)
从统计数据来看,它们看起来都是平等的。但有几个提示:
select *
,只选择您需要的字段答案 1 :(得分:1)
在oracle中,这两个都将以相同的方式处理。在解析(=细分)查询时会出现任何差异,如果查询运行多次,即使这样也会有所不同,因为解析结果是缓存的。
将效率工作集中在更低效的流程上,例如:加入和子查询。
答案 2 :(得分:1)
AUTOTRACE告诉你,在这种情况下,查询的执行方式完全相同,因此两者都不比另一个好。两者都涉及全表扫描。数据库可以非常智能地进行优化。 Oracle可能花费1纳秒来减少<>
版本的查询计划。
您的培训师可能尝试制作的一般要点涉及何时可以使用索引,何时不能。因此,带有IN的SELECT可能比带有NOT IN的SELECT运行得更快,因为DB更有可能使用索引搜索前者。