整理最近看到的SQL優化

SQL語句優化數據庫效率

(1)布爾值上的索引無效

例 :病區醫囑表 (bqyz) 中醫囑記費標誌 (jfbz)

爲布爾型,雖然在該列上建立索引,但要檢索哪

些醫囑未曾記費,速度依然較慢。後來在做優化

時把 jfbz 數據類型改爲 Number(1),再在該列上

重新創建索引,PB 程序配合修改,同樣硬件下,

速度提高近 30 倍。


(2)隱式轉換與索引失效

例 :出院病人信息表 (zy_brry) 中病人 ID

號 (zybrid) 字段定義爲 varchar2 (10), 但在查詢

時把該字段作爲 number 類型以 where 條件傳給

Oracle, 這樣會導致索引失效。

錯誤的例子 :

SELECT *

FROM zy_brry

WHERE ZYBRID = 201209101;

正確的例子 :

SELECT *

FROM zy_brry

WHERE ZYBRID =‘201209101’;

(3)對索引列進行運算導致索引失效

例:住院收費項目 (zysfxm) 中項目金額 (xmje)

上建有索引,where 子句中對列的任何操作結果

都是在 S QL 運行時逐列計算得到的 , 因此它不得

不進行全表搜索 , 而沒有使用該列上的索引。

錯誤的例子 :

SELECT *

FROM zysfxm

WHERE xmje/30=1000;

正確的例子 :

SELECT *

FROM zysfxm

WHERE xmje=1000*30;







如何創建索引,提高數據庫執行效率

1)索引創建原則。在select操作佔大部分的表上

創建索引;在where子句中出現最頻繁的列上創建索

引;在選擇性高的列上創建索引;複合索引的主列應

該是最有選擇性的和where限定條件最常用的列;小於

5 M的表,最好不要使用索引來查詢,表越小,越適合

用全表掃描。

2)索引使用原則。查詢結果是所有數據行的5%以

下時,使用index查詢效果最好;where條件中經常用

到表的多列時,使用複合索引效果會好於幾個單列索

引;因爲當SQL語句所查詢的列全部都出現在複合索引

中時,此時由於Oracle只需要查詢索引塊即可獲得所

有數據,當然比使用多個單列索引要快得多;索引利

於select,但對經常insert、delete尤其update的

表,會降低效率。




SQL編寫原則

原則1

建議使用CBO(基於開銷的優化器cost-based-

optimizer);對於任何SQL語句一定要考慮其性能;

通過查看執行計劃來比較SQL語句的優劣,防止經驗

主義;可以利用hint等功能,只在非常必要時才使用

hint:僅在對SQL的執行計劃非常肯定地要使用hint時

才使用。

原則2

Where條件中等號左邊不要引用函數;where條件中

對於不同的數據類型要做顯示數據轉換;NOT,!=,<>,||

不會用索引;not exists好於not in;Exists好於in;

用UNION代替DECODE;用UNION ALL代替UNION;用UNION

代替OR;RDER BY不要加表達式。

原則3

避免複雜的SQL語句,採用多條語句代替;避免不

必要的排序,使用Distinct、Group by、Order by等;

使用表的別名;連接多個表時, 把表的別名前綴於每個

column上,這樣可減少解析的時間以及避免由column歧

義引起的語法錯誤。

原則4

使用複合索引的第一個列;及時commit釋放資源,

回滾段上用於恢復數據的信息;commit不要太頻繁;分

批處理、逐次提交。

原則5

分頁;運算放在常量端;全表刪除用truncate而不

用delete;刪除大量數據的方法;更新大量數據時使用

臨時表。

原則6

綁定變量ID=1 / ID=:V;硬分析/軟分析:語法檢

測、語義檢查、檢查共享池中是否有相同的語句存在,

如果存在,則重用共享池中的SQL的執行計劃和優化策略

(軟解析);如果不存在,則重新生成SQL的執行計劃和

優化策略(硬解析)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章