總結---與ORACLE數據庫交互程序性能優化篇

SQL語句優化
    這個好辦,抓到佔用CPU高的SQL語句,根據索引、SQL技巧等改寫一下,立竿見影。

 

SELECT時不使用函數
    在做頻繁的查詢操作時,儘量直接select字段名,然後使用C語言代碼對查詢結果做二次加工,避免讓Oracle來做複雜的函數或者數學運算。因爲Oracle出於通用性的考慮,其函數及數學運算的速度遠不如用C語言直接編譯成機器碼後運算來的快。

 

綁定變量
    這個可以大幅度降低SQL的“hard parse”,我們大部分程序都已經實現了變量綁定。個別沒有實現的,修改一下,也能很快看到效果。

 

批量FETCH
    如果一次select會返回多條(幾百、上千)記錄,使用批量Fetch,比如一次fetch 1000條記錄,要比一條條的fetch數據快的多,也可以有效降低 oracle的壓力。

 

批量提交
    一次修改多條(比如小於10000條左右)記錄,然後一次性提交,要比每條提交一次快的多。當然前提是業務邏輯允許這樣做。

 

批量增刪改
    如果需要一次性修改或者刪除多條記錄,可以採用批量數組綁定的方式,這個和前面說得“綁定變量”類似,區別是前者綁定的是一個變量,這裏綁定的是一個大數組的首指針,這種方式要比逐條綁定執行快的多。

 

SQL預解析
    前面的大部分是批量操作,還有一種常見的場景是小事務操作,但頻率非常高。這種場景一般SQL也不復雜,幾乎沒有優化的餘地了,但是由於操作頻繁,同樣會造成CPU居高不下。目前我們的程序大部分都是下面這個應用模式:
loop
    parse sql;
    bind var;
    execute sql;
end loop;
    雖然我們使用了綁定變量的方式,但是由於操作頻繁,同樣造成大量的“soft parse”以及網絡通信。在內存數據庫中,我們一般採用預解析的方式來提高效率,事實上,Oracle很早就給開發者提供這種模式,只是開發者嫌麻煩沒有使用而已。將程序改成下列模式:
parse sql;
bind var;
loop
    execute sql;
end loop;
    這樣就可以有效降低Oracle的壓力,可以將執行效率至少提高一倍。但是這種模式涉及到程序結構的變更,必須在設計階段就這樣做。否則,後期再調整的話,風險和工作量都會很大。

 

SQL語句的一些優化方法

1、SQL語句用大寫的;因爲Oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。
2、避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響。
3、當Oracle“碰到”NOT,他就會停止使用索引轉而執行全表掃描。
4、避免在索引列上使用計算。WHERE子句中,假如索引列是函數的一部分。優化器將不使用索引而使用全表掃描。
5、儘量少用DISTINCT操作,用EXISTS代替DISTINCT


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