Oracle資料庫SQL語句效能調整的基本原則 (2)
4. Order by語句
ORDER BY語句決定了Oracle如何將返回的查詢結果排序。Order by語句對要排序的列沒有什麼特別的限制,也可以將函式加入列中(象聯接或者附加等)。任何在Order by語句的非索引項或者有計算表示式都將降低查詢速度。
仔細檢查order by語句以找出非索引項或者表示式,它們會降低效能。解決這個問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表示式。
5. NOT
我們在查詢時經常在where子句使用一些邏輯表示式,如大於、小於、等於以及不等於等等,也可以使用and(與)、or(或)以及not(非)。NOT可用來對任何邏輯運算子號取反。下面是一個NOT子句的例子:
... where not (status ='VALID')
如果要使用NOT,則應在取反的短語前面加上括號,並在短語前面加上NOT運算子。NOT運算子包含在另外一個邏輯運算子中,這就是不等於(<>)運算子。換句話說,即使不在查詢where子句中顯式地加入NOT詞,NOT仍在運算子中,見下例:
... where status <>'INVALID';
再看下面這個例子:
select * from employee where salary<>3000;
對這個查詢,可以改寫為不使用NOT:
select * from employee where salary<3000 or salary>3000;
雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。
6. IN和EXISTS
有時候會將一列和一系列值相比較。最簡單的辦法就是在where子句中使用子查詢。在where子句中可以使用兩種格式的子查詢。
第一種格式是使用IN操作符:
... where column in(select * from ... where ...);
第二種格式是使用EXIST操作符:
... where exists (select 'X' from ...where ...);
我相信絕大多數人會使用第一種格式,因為它比較容易編寫,而實際上第二種格式要遠比第一種格式的效率高。在Oracle中可以幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢。
第二種格式中,子查詢以‘select 'X'開始。運用EXISTS子句不管子查詢從表中抽取什麼資料它只檢視where子句。這樣優化器就不必遍歷整個表而僅根據索引就可完成工作(這裡假定在where語句中使用的列存在索引)。相對於IN子句來說,EXISTS使用相連子查詢,構造起來要比IN子查詢困難一些。
通過使用EXIST,Oracle系統會首先檢查主查詢,然後執行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle系統在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用EXISTS比使用IN通常查詢速度快的原因。
同時應儘可能使用NOT EXISTS來代替NOT IN,儘管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查詢效率更高。
=====================================================
Oracle的SQL調優是一個複雜的主題,甚至是需要整本書來介紹OracleSQL調優的細微差別。不過有一些基本的規則是每個OracleDBA都需要跟從的,這些規則可以改善他們系統的效能。SQL調優的目標是簡單的:
消除不必要的大表全表搜尋:不必要的全表搜尋導致大量不必要的I/O,從而拖慢整個資料庫的效能。調優專家首先會根據查詢返回的行數目來評價SQL。在一個有序的表中,如果查詢返回少於40%的行,或者在一個無序的表中,返回少於7%的行,那麼這個查詢都可以調整為使用一個索引來代替全表搜尋。對於不必要的全表搜尋來說,最常見的調優方法是增加索引。可以在表中加入標準的B樹索引,也可以加入bitmap和基於函式的索引。要決定是否消除一個全表搜尋,你可以仔細檢查索引搜尋的I/O開銷和全表搜尋的開銷,它們的開銷和資料塊的讀取和可能的並行執行有關,並將兩者作對比。在一些情況下,一些不必要的全表搜尋的消除可以通過強制使用一個index來達到,只需要在SQL語句中加入一個索引的提示就可以了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-264846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫SQL語句效能調整的基本原則 (3)Oracle資料庫SQL
- Oracle資料庫SQL語句效能調整的基本原則 (1)Oracle資料庫SQL
- 【資料操作】SQL語句效能調整原則SQL
- SQL語句效能調整原則(zt)SQL
- Oracle效能調整之--DML語句效能調整Oracle
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- oracle資料庫的效能調整Oracle資料庫
- oracle資料庫的效能調整(轉)Oracle資料庫
- sql 正則替換資料庫語句!SQL資料庫
- SQL Server SQL語句進行優化的基本原則SQLServer優化
- oracle效能調整(2)Oracle
- ORACLE效能調整---2Oracle
- oracle效能調整2Oracle
- Oracle 資料庫監控SQL語句Oracle資料庫SQL
- Oracle SQLT 診斷SQL語句效能(2)OracleSQL
- SQL Server SQL語句進行優化的基本原則 (轉)SQLServer優化
- 【資料庫】SQL語句資料庫SQL
- Oracle效能調整-2(轉)Oracle
- Oracle高效能SQL調整OracleSQL
- Oracle資料庫效能調整 - 建議器 ADVICEOracle資料庫
- 資料庫效能優化之SQL語句優化資料庫優化SQL
- mysql資料庫sql語句基礎知識MySql資料庫
- 資料庫常用的sql語句大全--sql資料庫SQL
- 資料庫常用sql 語句資料庫SQL
- 資料庫SQL拼接語句資料庫SQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- oracle資料庫:耗cpu sql語句優化Oracle資料庫SQL優化
- Oracle資料庫維護常用SQL語句集合Oracle資料庫SQL
- oracle資料庫巡檢(一)基本sql語句Oracle資料庫SQL
- 1.4 資料庫和常用SQL語句(正文)——MySQL資料庫命令和SQL語句資料庫MySql
- ORACLE資料庫體系框架介紹及SQL語句效能探討(轉)Oracle資料庫框架SQL
- Oracle 資料庫引數調整Oracle資料庫
- 資料庫常用操作SQL語句資料庫SQL
- SQL資料庫連線語句SQL資料庫
- 找到Oracle資料庫中效能最差的查詢語句BSOracle資料庫
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- oracle資料庫常用語句Oracle資料庫
- Oracle資料庫語句大全Oracle資料庫