oracle 优化分组 sql语句,Oracle SQL语句之常见优化方法 五
0、低效SQL語句查詢:
SELECT b.sql_text, --SQL內容
a.sid,
a.serial#,
a.status,
a.machine, --哪臺機器運行的SQL
a.username, --用戶
a.module, --運行方式
a.action, --Responsibility
c.opname,
c.target,
c.message,
c.sofar totalwork * 100, --工作執行了百分之多少
c.elapsed_seconds, --己?用了多少(秒)
c.time_remaining, --剩多少(秒)
round(a.last_call_et 60 60,
2)
FROM v$session ? ? ? ? a,
v$sqlarea ? ? ? ? b,
v$session_longops c
WHERE a.sql_hash_value = b.hash_value(+)
AND a.sid = c.sid(+)
AND a.serial# = c.serial#(+);
1、Where中的優化:
對可以過濾數據最多的,放到后面,原理也是Oracle執行從下到上(從右到左)的順序。
2、From字段中的優化:
Oracle安照從右到左的順序加載表數據,應該把可以排除數據最多的表放到后面(基礎表)。
比如,在關聯查詢中,把課程表放到后面,成績表放到前面,因為課程表數據一般比較少,關聯的時候可以快速的過濾掉一些成績數據。
3、使用具體的列名替代 *:
這樣可以省去從字典表中解析的過程 .Oracle執行sql語句過程:
在共享池中搜索sql語句是否已經存在,驗證sql是否語法精確,執行數據字典驗證表和列的定義,獲取對象的分析鎖,以便在語句的分析過程中對象的定義不會改變,檢查用戶是否具有相應的操作權限,確定語句最佳執行計劃,將語句和執行方案保存到共享的sql區。
4、使用?參數形式:
盡量不要使用拼接字串的方式,因為帶有?的參數形式會緩存分析結果,省去上面很多步驟。
5、使用decode函數:
decode不會重復掃描相同記錄或重復連接相同的表,減少表的掃描次數。
6、使用truncate替代delete:
delete:逐條刪除,并保存回滾還原點。DML(數據操作語言insert,update,delete,merge)
truncate不會保存回滾點,是DDL(數據定義語言,如drop,alter)
在oracle里DML是可以rollback的,而DDL是不可以的
如果數據量大,差別很大的。
7、盡量多用commit:
Oracle只有在commit后才會提交(區別于sqlserver),如果沒有提交,會在內存中保存很多數據。commit后釋放的資源有:
回滾上段用于恢復數據庫的記錄信息,被程序語句獲得的鎖,
Redo log buffer中的空間,為管理上述3種資源的內部花費.
提交的頻率和內存,緩存,索引等規模有關系。
8、盡量使用where語句替代having子句:
在分組或者配合group的時候會使用having。
where會直接過濾掉數據,使用having往往會配合group,檢索出數據后,會帶著數據進行排序、統計等。
9、on/where/having排序使用順序:
on:做的是數據映射,在映射時,把沒用的數據直接過濾掉了
where:先進行一個全表的搜索,之后再進行數據篩選
where又比having要快,having中帶的垃圾數據同樣也做了運算
10、減少對表的查詢(特別是自查詢):
在含有子查詢的sql語句中,要特別注意減少對表的查詢。
Select tab_name from tables where (tab_name,db_ver)=(select tab_name,db_ver from tab_columns where version=604)
11、一定使用表別名(特別是多表查詢):
減少對sql語句解析的時間并減少由多個表相同的Column名歧義引起的語法錯誤,如果不使用別名,會去字典表中查找,判斷是否有列名歧義。
12、使用exists替代in
使用not exists替代not in:
Oracle采用命中即返回的方式,在多表鏈接查詢時,如果使用in會導致子查詢的表全表遍歷,并排序、合并,這時候可以使用外鏈接或not ?exists 替代。
13、識別低效率執行的語句:
各種sql優化的圖形工具層出不窮,但可以寫出自己的sql工具來解決問題
SELECT executions,
disk_reads,
buffer_gets,
round((buffer_gets - disk_reads) buffer_gets,
2) hit_radio,
round(disk_reads executions,
2) reads_per_run,
sql_text
FROM v$sqlarea
WHERE executions > 0
AND buffer_gets > 0
AND (buffer_gets - disk_reads) buffer_gets < 0.8
ORDER BY 4 DESC;
下期更精彩
總結
以上是生活随笔為你收集整理的oracle 优化分组 sql语句,Oracle SQL语句之常见优化方法 五的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle中行数少于1000,orac
- 下一篇: linux ini文件,Shell sc