在awr報告中,發現有個sql效率很低:
select batch_status from t_batch_info
where batch_status='0'
and sys_id='stm06';
檢視執行計畫發現查詢利用了索引,索引中包含了batch_status欄位,但是通過以下sql查詢:
select batch_status,count(*) from t_batch_info
group by batch_status
發現batch_status欄位的值很少:
batch_status count(*)
0 40350
1 4237357
2 1227
3 433515
之前sql的查詢條件是batch_status='0',它只有4萬多條資料,而絕大部分都是1,有400多萬條資料,因此雖然用到了索引,但是使用效率低,
為解決這個問題,建立了函式索引,利用null值不進索引的特性,
create index ix_t_batch_info on t_batch_info (decode(batch_status,'1',null,'2',null,'3',null,batch_status)) online;
而查詢語句改成:
select batch_status from t_batch_info
where decode(batch_status,'1',null,'2',null,'3',null,batch_status)='0'
and sys_id='stm06';
經過驗證,效率提高很多。
Oracle SQL優化之使用索引提示一例
今天早上在做資料庫的安檢時候,發現乙個ora 01555錯誤 這個sql語句明顯執行了很長時間而沒有完成。在觀察statspack報告中這個sql也在top sql中占用了大量的db cache。物理讀很大。下午做完其他的就打算優化一下這個sql 首先檢視這個sql的執行計畫 在pl sql dev...
演算法優化一例
本文將以排序演算法中的插入排序為例,介紹優化演算法,編制高效程式的方法。人們通常用於排序手中橋牌的方法是一次考慮一張牌,將它插入到已經排序過的牌的適當位置中 時刻讓它們保持有序 在計算機實現中,我們需要將較大的元素移到右邊,為插入的元素準備空間,然後再在空位置上插入該元素。該演算法的通常的乙個實現如...
sql優化一例
原sql,查詢總數300,每頁15資料也要8秒 select a from table where date format my time,y m d 2012 08 15 limit 0,15 優化後的sql,查詢總數18000,每頁15的資料只要1秒 select a from table wh...