語句快取 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優化器...