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的執行計劃和
優化策略(硬解析)。