2011-04-23 104 views
1

這兩個查詢中哪一個更高效?哪種SQL查詢更高效?

  1. SELECT *FROM Emp WHERE DeptNo<>20

  2. 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 
+5

我非常懷疑其中一個查詢的速度明顯快於另一個。一般來說, – Codo 2011-04-23 15:29:39

+0

很大程度上取決於統計數據。儘管這似乎對所有人都是一樣的。 – Guru 2011-04-23 18:33:12

+2

請注意如何有8個一致獲得?兩者都不是比其他更有效率。 – 2011-04-23 23:59:08

回答

1

在oracle中這兩種會以同樣的方式被處理。解析(=細分)查詢會產生任何差異,如果查詢運行多次,那麼即使這樣做會有所不同,因爲解析結果會被緩存。

專注於效率更低的流程(例如,連接和子查詢。

+0

有沒有什麼辦法可以檢查CPU週期?第一個查詢會有14個掃描程序,第二個查詢會有28個掃描程序? – aBs0lut3z33r0 2011-04-23 16:15:32

+0

查詢非常簡單,您不會看到區別。如果你想要衡量一個,CPU週期因實現而異。嘗試測試大型記錄號碼(幾十個1000)。但是,將DEPTNO colmun編入索引的效果比您寫出「NOT」的確切方式更有效。 – boisvert 2011-04-23 16:42:25

4

從統計數據看,他們看起來都是平等的。一對夫婦的提示,但:

  • 不要使用select *,只選擇你需要
  • 領域確保你有正確設置
+0

建議+1僅選擇您需要的字段 – 2011-04-23 19:53:57

1

自動跟蹤是告訴你,在這種情況下,指標,查詢以完全相同的方式執行,因此兩者都不如其他。兩者都涉及全表掃描。數據庫可以非常聰明地進行優化。 Oracle可能會花費1納秒的時間來獲取<>版本的查詢計劃。

您的培訓師可能已嘗試製作的一般要點涉及何時可以使用索引以及何時不使用索引。因此,帶IN的SELECT可能會比帶NOT IN的SELECT運行得更快,因爲DB有更好的機會爲前者使用索引搜索。