ORACLE SQL查詢優化

2021-10-07 08:25:16 字數 2167 閱讀 9567

語句快取  sql語句 -》共享池 -》快取記憶體

軟解析:從共享池中 取出 以前的解析 過的語句

硬解析:重新開始新的解析

硬解析會消耗資源多很多,sql可以復用還是要復用的。

sql語句 -> hsah 值 當做key ,存入快取記憶體中(sql語句的大小寫會影響key)

使用繫結變數,sql還可以復用

所以,sql查詢兩次的大小寫不要變來變去,還有,使用繫結變數。

select * from v$sql 可以查詢出在快取記憶體池的sql語句
在必要列中新增索引。

索引分為 唯一性索引、普通索引、組合索引。

組合索引:

1:適用在單獨查詢返回記錄很多,組合查詢後忽然返回記錄很少的情況:如以類別和

2:要考慮順序,第一列為引導列,

oracle索引掃瞄型別:索引範圍掃瞄、索引唯一掃瞄、索引全掃瞄、索引跳躍掃瞄、索引快速全掃瞄

索引唯一掃瞄: 對 unique、primary key索引作為調節的時候,會使用唯一掃瞄

索引範圍掃瞄:

返回值不唯一,索引列可以是唯一索引,也可以是不唯一索引,條件可以是 <、>、=等

範圍掃瞄索引表

索引全掃瞄:

1:選擇列是唯一性索引,也就是全掃瞄索引就可以得到值 (id 為索引列)

比如 select id from tb_***

2:使用max(索引列)

select max(dabh) from tb_da

索引跳躍掃瞄

復合索引中,非引導列查詢可能走索引跳躍掃瞄

索引快速全掃瞄

當索引列有非空約束時,這時索引

怎麼查詢是怎麼走索引的呢,對了,執行計畫:

方法1:

explain plan for

select * from scott.emp; --要解析的sql指令碼

select * from table(dbms_xplan.display);

(pl/sql f5 也能進入此處的執行計畫)

不用執行sql語句就可以進行分析,但資訊量少

方法2:sqlplus命令

set autotrace traceonly explain;

select * from ....

通過執行計畫,就可以看到到底是全表查詢還是索引查詢。

你還可以通過執行計畫看到table access by index rowid 操作,這個就是回表,回表也有一定的時間消耗

回表:

table access by index rowid

oracle查詢的列 不在索引列時,會根據rowid去回表查詢

網上很多說 in 不走索引,其實是錯誤的,那應該是老版本的資料庫,in走不走索引,應該還要看返回列的數量多少,通常in是走索引的。
通常情況下in的效率會比or高

in的優化:

思路1:

sql語句中經常使用in來查詢

oracle有個限制,不能超過1000個引數

而且這種用法很低效,可以把引數設為乙個表,做hash join查詢提高效能

1、用exists來代替(特定情況下)

2:用left join 代替

in和exists對比:

若子查詢結果集比較小,優先使用in,若外層查詢比子查詢小,優先使用exists。

因為若用in,則oracle會優先查詢子查詢,然後匹配外層查詢,

若使用exists,則oracle會優先查詢外層表,然後再與內層表匹配。最優化

匹配原則,拿最小記錄匹配大記錄。

union all : 兩張表進行合併,不去重,不排序,效率比union高很多

union: 兩張表進行合併,去重+排序

select id,dabh from tb_a where ***

union all

select id,dabh from tb_b,where ***

在不用索引的情況下,用union all代替in的效率會高,具體還需要測試

Oracle SQL 查詢優化 Part1

一 空值處理 1.查詢空值 null select from emp where emp.empdesc null select from emp where emp.empdesc is null 2.空值 null 不能做 加 減 乘 除 比較 等運算 select from emp where...

Oracle SQL 查詢優化 Part2

一 排序 1.按返回列的順序排序 通常排序都是 order by 後邊加列名,也可以寫為 order by 後邊加列所在的次序。下邊的查詢結果是一樣的 order by 加返回列所在的次序 select emp.empsalary,emp.from emp order by 1 asc order ...

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...