oracle 查詢語句優(yōu)化錄

最近,因為發(fā)現(xiàn)以前使用的數(shù)據(jù)查詢語句的效率越來越差,導致每次進行大量數(shù)據(jù)的操作都需要耗一個小時以上.這速度實在是太龜慢了,簡直是無法忍受了.本人決定親自拿把殺豬刀砍向它,好給它顏色瞧瞧.經(jīng)過一系列的測試后發(fā)現(xiàn),原來罪灰禍手是查詢數(shù)據(jù)時因為語句的組合方式不對導致了數(shù)據(jù)庫查詢慢,當時那個淚崩啊,感覺這實在是太坑爹了.

? ? ?因此,我就借此機會把我所知道的能提高查詢效率的方法整理了一下,并分享出來和大家共同學習.

一. 書寫順序方面

我們常常會在寫oracle語句后發(fā)現(xiàn)該語句的執(zhí)行時間過長,效率低下的問題.然而我們有沒有想過怎么會發(fā)生這樣的情況呢?

我大致歸納為兩個方面:

第一: 不了解oracle的解析器解析sql語句的順序

a. 數(shù)據(jù)表的處理順序

oracle 在解析一個查詢語句FROM后面的一系列數(shù)據(jù)表是按照從右往左的順序進行的.也就是說最后的數(shù)據(jù)表將是最先被oracle處理的,所以我們在寫多個表關聯(lián)的查詢語句時,把數(shù)據(jù)量最小的表或者是經(jīng)過條件篩選后得到數(shù)據(jù)量最小的表放到最后,數(shù)據(jù)量大的表就放在最前面.

select col1, col2 from t1, t2 where t1.id = t2.id ?and t2.sex = 'male';

上面的語句中數(shù)據(jù)表t2是第一個被oracle處理的數(shù)據(jù)表,然后就是t1.

b.where 條件的處理順序

oracle 在解析查詢語句制定執(zhí)行計劃時,針對where后面的查詢條件的解析是按照從下往上的順序進行的.也就說查詢的子條件越處于where的后面,它被oracle處理優(yōu)先級就越高.所以我們可以把能過濾大量數(shù)據(jù)的條件放到最后,讓oracle優(yōu)先處理它從而返回一個最小數(shù)據(jù)集,好讓oracle在后續(xù)的過濾工作基于該最小數(shù)據(jù)集進行,來縮小整個查詢時間.

select col1, col2 from t1, t2 where t1.id = t2.id and t2.sex = 'male' and t2.etime>=trunc(sysdate-1)?and t2.etime

上面語句中的查詢條件t2.channel = '0' 將會被oracle最先解析.

第二:查詢方式的錯誤選擇導致效率低下

平時工作下來積累的一些優(yōu)化建議如下:

1. where 后面的條件盡量避免涉及null值得判斷,為什么呢?那是因為一旦涉及到了null的判斷,oracle將不會走該字段所涉及的索引而觸發(fā)全表掃描.

select col1 from t where t.servid is not null; --效率低

如果t表的servid中有索引的話,那么本次查詢將拋棄索引,走全表掃描.建議如果真的需要判斷的話,可以定義該字段的默認值為0或者其它值.

2. where 后面盡量不要使用多個or把條件組合起來, 可以使用union/union all來實現(xiàn)

select col3, col5 from t where (t.servid = 5 or t.servid = 90) and t.channel = 1; --效率低

select col3, col5 from t where t.servid = 5 and t.channel = 1

union

select col3, col5 from t where t.servid = 90 and t.channel = 1; ? --效率高

3. 條件中盡量避免給有索引的字段進行不等操作(!=或<>),因為一旦進行不等操作,oracle將不會走現(xiàn)有的索引轉而走全表掃描.

4. 返回結果使用具體的列名來代替星號(*),因為oracle 遇到星號 需要另外去查對應的字典從而把所有的列名給轉換出來,這導致了需要消耗時間.

5. 訪問數(shù)據(jù)表的次數(shù)盡量少

6. 使用exists 來代替in , not exists 代替not in 來提交數(shù)據(jù)的訪問速度

7. 不要對有索引的字段進行函數(shù)操作或者運算操作,不然會導致這些字段不會走索引

select col1 from t where (t.servid * 2) = 10; --效率低下

select col1 from t where t.servid = 10/ 2; --效率高

8. 當需要刪除大量數(shù)據(jù)的時候,如果條件允許的話,可以使用truncate 來代替delete. 因為delete 時數(shù)據(jù)庫時需要維護一系列的信息以便進行回滾等操作,而truncate 則不是要額外維護這些信息,直接高效清空數(shù)據(jù)庫表.

9. 如果表有分區(qū)的話,盡量使用分區(qū)進行查詢.因為同類的數(shù)據(jù)都集中在一個分區(qū)(數(shù)據(jù)塊)里面,查詢是不需要跨塊查詢,從而效率較高

10. ?比較大小時盡量使用等于號來提高效率

select col1 from t where t.servid > 60; --效率比較低下,因為dml會直接跳到60這個記錄上,然后在往前掃大于60的記錄,額外的動作,額外的消耗.

select col1 from t where t.servid >= 61; --效率高

11. 判斷是否存在某條記錄時,使用exists 來提高效率,它可以避免進行全表掃描

select count(*) from t where t.name = 'Gavin'; ?--效率低下,進行全表掃描

select count(1) from dual where exists(select null from t where t.name='Gavin'); --效率高

12. ?union all 效率高于union ,因為union 相對于union all 來說多了一個去重的操作

13. 可以使用視圖來加速結果的搜索

14. 如果對有索引的字段進行模糊搜索時,盡量使用單右邊模糊匹配查詢,這樣就可以使它能有效的使用對應的索引.

select col5 from t where t.name like '%Ga%'; --效率低,不走索引

select col5 from t where t.name like 'Ga%'; ?--效率高,走索引

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圾结,一起剝皮案震驚了整個濱河市娃弓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖梗醇,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓俭,死亡現(xiàn)場離奇詭異,居然都是意外死亡元践,警方通過查閱死者的電腦和手機蚯窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門掸鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塞帐,“玉大人,你說我怎么就攤上這事巍沙】眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵句携,是天一觀的道長榔幸。 經(jīng)常有香客問我,道長矮嫉,這世上最難降的妖魔是什么牡辽? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮敞临,結果婚禮上,老公的妹妹穿的比我還像新娘麸澜。我一直安慰自己挺尿,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布炊邦。 她就那樣靜靜地躺著编矾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馁害。 梳的紋絲不亂的頭發(fā)上窄俏,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音碘菜,去河邊找鬼凹蜈。 笑死,一個胖子當著我的面吹牛忍啸,可吹牛的內(nèi)容都是我干的仰坦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼计雌,長吁一口氣:“原來是場噩夢啊……” “哼悄晃!你這毒婦竟也來了?” 一聲冷哼從身側響起凿滤,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妈橄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翁脆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眷蚓,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年反番,在試婚紗的時候發(fā)現(xiàn)自己被綠了溪椎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片普舆。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖校读,靈堂內(nèi)的尸體忽然破棺而出沼侣,到底是詐尸還是另有隱情,我是刑警寧澤歉秫,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布蛾洛,位于F島的核電站,受9級特大地震影響雁芙,放射性物質(zhì)發(fā)生泄漏轧膘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一兔甘、第九天 我趴在偏房一處隱蔽的房頂上張望谎碍。 院中可真熱鬧,春花似錦洞焙、人聲如沸蟆淀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熔任。三九已至,卻和暖如春唁情,著一層夾襖步出監(jiān)牢的瞬間疑苔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工甸鸟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惦费,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓抢韭,卻偏偏與公主長得像趁餐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篮绰,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,231評論 0 7
  • SQL 優(yōu)化(載錄于:http://m.jb51.net/article/5051.htm) 作者: (一)深入淺...
    yuantao123434閱讀 734評論 0 7
  • 什么是SQL數(shù)據(jù)庫: SQL是Structured Query Language(結構化查詢語言)的縮寫后雷。SQL是...
    西貝巴巴閱讀 1,816評論 0 10
  • 只要真心付出了,就會有收獲吠各,首先為艷群感恩臀突,感恩她一直堅持十一奉獻,并且很敞開也順服贾漏,也感恩今天收到又大又紅的櫻珠...
    周淑峰閱讀 164評論 0 0
  • 有一種心痛候学,像枯了的枝椏 沒入水底 轉瞬 同人聊起 像無關緊要的話題 要有多隱忍 才會不著痕跡 唱一首歌 如夜夜夜夜里
    白千尋閱讀 168評論 1 4