這是一個真實的應用,客戶報了一個EBS的performance bug, 在Invoice form裏,選擇了一個客戶後,再打開賬單地址(location)的LOV,花了20分鐘出來了3條地址數據.
分析了客戶上傳的trc文件(轉成prf),發現查詢是類似這樣的:
select t1.customer_id, t1.customer_name, t2.location
......
from customer t1, customer_site t2
where t1.customer_number = :P_number
and t1.site_id = t2.customer_site_id
and t2.location like '%%'
在prf中顯示,對customer_site表是 INDEX SCAN, 返回了800多萬條數據, 再查看了customer_site表定義,發現對存在這樣一個index: INDEX_N4 on (location), 這是一個單一索引,感覺使用這個單一索引和全表掃描並沒有太大區別,因爲是先查找出了800多萬條數據,然後再進行外連接,所以效率這麼低.
於是想到了用複合索引,因爲查詢條件中涉及到了兩個列(customer_site_id和location),所以把customer_site_id也加入到索引INDEX_N4中,於是索引爲這樣:
create index INDEX_N4 on customer_site(location,customer_site_id)
然後再讓客戶試了一下,查詢時間減少到了幾秒鐘.
在建立這個複合索引的時候,對於這個順序我糾結了一陣子,索引列的順序對查詢的性能還是有影響的,所以這兩列的順序也要確定一下,網上搜索了一下發現有這樣的約定:
1. 選擇性最大的列做複合索引的前導列.
2. 查詢時where的列能包含索引列.
這兩列都在where查詢語句中,所以添加customer_site_id到索引中是正確的,而在這裏location的選擇性比customer_site_id大,所以location放前面.在比較確定做這樣的改變能解決客戶問題後,我把這個解決方案給了客戶,事實上也確實解決了客戶的問題.
Oracle 通過複合索引提高查詢性能的一個真實客戶例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
使用pl/sql圖形化工具連接Oracle數據庫後顯示自己創建的表或者指定顯示錶
entomb
2018-08-27 20:02:39
Oracle9i初始化參數中文說明
jx_zzy
2018-08-27 19:53:51
如何取出Oracle某一用戶的密碼,再原封不動的改回去?
jx_zzy
2018-08-27 19:53:51
Oracle學習筆記--3、基本函數的使用
polo_longsan
2018-08-27 19:46:30
用Java實現遍歷Oracle數據庫某用戶下的所有數據,找出想要查找的記錄
whistle_2005
2018-08-27 19:43:08
Oracle 中獲取特定日期時間 (need to H)
Balance1781
2018-08-27 19:36:51
Create a link from SQL SERVER to Nortel CCM7 (InterSystems Cache DB)
Balance1781
2018-08-27 19:36:51
Oracle+Materialized+View+(物化視圖) (to H)
Balance1781
2018-08-27 19:36:51
AI-Chapter 3 Database Storage and Schema Objects
iteye_19890
2018-08-27 19:27:46
connect by…start with...
懒萝卜
2018-08-27 19:16:28
SGA與PGA應該如果分配內存
fiona8953
2018-08-27 19:12:00
Oracle中Select語句的特性
fiona8953
2018-08-27 19:12:00