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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql 正則替換資料庫語句!SQL資料庫
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- 【資料庫】SQL語句資料庫SQL
- [20220331]如何調整sql語句.txtSQL
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- 資料庫常用的sql語句大全--sql資料庫SQL
- mysql資料庫sql語句基礎知識MySql資料庫
- Oracle資料庫語句大全Oracle資料庫
- oracle資料庫常用語句Oracle資料庫
- 1.4 資料庫和常用SQL語句(正文)——MySQL資料庫命令和SQL語句資料庫MySql
- 找到Oracle資料庫中效能最差的查詢語句BSOracle資料庫
- SQL語句在oracle資料庫中的初級應用(上)SQLOracle資料庫
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- 資料庫常用操作SQL語句資料庫SQL
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- 資料庫常用的sql語句彙總資料庫SQL
- oracle-資料庫- insert 插入語句Oracle資料庫
- 基於C#語言Oracle.ManagedDataAccess操作Oracle資料庫連線語句C#Oracle資料庫
- 掌握Oracle資料庫效能調優方法Oracle資料庫
- Oracle基本SQL語句OracleSQL
- GaussDB資料庫SQL系列-動態語句資料庫SQL
- Oracle Tuning (Oracle 效能調整)的一些總結(轉)2Oracle
- Spark效能調優——9項基本原則Spark
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫
- 【SQL】Oracle資料庫變更後sql效能對比SQLOracle資料庫
- idea內建資料庫 + sql語句庫表操作Idea資料庫SQL
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- Oracle OCP(01):使用SQL SELECT語句檢索資料OracleSQL
- Sql Server 資料庫獲取字串中小寫字母的SQL語句SQLServer資料庫字串
- 【SQL】Oracle資料庫資料量及效能資訊收集SQLOracle資料庫
- MySQL資料庫中SQL語句分幾類?MySql資料庫
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- Oracle資料庫多條sql執行語句出現錯誤時的控制方式Oracle資料庫SQL
- SQL查詢語句 (Oracle)SQLOracle
- 資料庫-SQL基礎語法資料庫SQL
- Oracle SQL精妙SQL語句講解OracleSQL
- 資料庫介紹--認識簡單的SQL語句資料庫SQL
- sql語句效能優化SQL優化
- SQL Server 資料庫部分常用語句小結(二)SQLServer資料庫