訪問
table
的方式
全表掃瞄
全表掃瞄就是順序地訪問表中每條記錄,
oracle
採用一次讀入多個資料塊(
databaseblock)
的方式優化全表掃瞄
通過rowid
訪問表
rowid
包含了表中記錄的物理位置資訊,
oracle
採用索引實現了資料和存放資料的物理位置(
rowid)
之間的聯絡,通常索引提供了快速訪問
rowid
的方法,因此那些基於索引列的查詢就可以得到效能上的提高
共享
sql語句
oracle提供對執行過的sql語句進行高速緩衝的機制。被解析過並且確定了執行路徑的sql語句存放在sga的共享池中。
oracle執行乙個sql語句之前每次先從sga共享池中查詢是否有緩衝的sql語句,如果有則直接執行該sql語句。
可以通過適當調整sga共享池大小來達到提高oracle執行效能的目的。
選擇最有效率的表名順序(1)
oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 drivingtable)將被最先處理
當oracle處理多個表時,會運用排序及合併的方式連線它們。首先,掃瞄第乙個表(from子句中最後的那個表)並對記錄進行派序,然後掃瞄第二個表(from子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第乙個表中合適記錄進行合併.
只在基於規則的優化器中有效
選擇最有效率的表名順序(2)
表 tab1 16,384 條記錄
表 tab2 1 條記錄
選擇tab2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇tab2作為基礎表 (不佳的方法)
select count(*) from tab2,tab1 執行時間26.09秒
選擇最有效率的表名順序(3)
如果有3個以上的表連線查詢, 那就需要選擇交叉表(intersectiontable)作為基礎表, 交叉表是指那個被其他表所引用的表.
select * from location l, category c,emp e
where e.emp_no between 1000 and 2000
and e.cat_no = c.cat_no
and e.locn = l.locn
將比下列sql更有效率
select * from emp e, location l, category c
where e.cat_no = c.cat_no
and e.locn = l.locn
and e.emp_no between 1000and 2000
where子句中的連線順序 (1)
oracle採用自下而上的順序解析where子句。
sssssss
根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。
where
子句中的連線順序
(2)(低效
,執行時間
156.3秒)
select …
from emp e
where sal > 50000
and job = 『manager』
and 25 < (select count(*) fromemp
where mgr = e.empno)(高效
,執行時間
10.6秒)
select …
from emp e
where 25 < (select count(*) fromemp
where mgr=e.empno)
and sal > 50000
and job = 『manager』
未完待續。。。。。。
oracle的SQL語句效能優化
使用oracle資料庫的應用系統,有時出現sql效能突然變差,特別是對於oltp型別系統執行頻繁的核心sql,如果出現效能問題,通常會影響整個資料庫的效能,進而影響整個系統的正常執行。這是常常遇到的問題,也是一些dba的挑戰。sql效能變差原因分析 sql的效能變差,通常是在sql語句重新進行了解析...
效能優化 SQL優化
1.列型別盡量定義成數值型別,且長度盡可能短,如主鍵和外來鍵,型別字段等等 2.建立單列索引 3.根據需要建立多列聯合索引 當單個列過濾之後還有很多資料,那麼索引的效率將會比較低,即列的區分度較低,那麼如果在多個列上建立索引,那麼多個列的區分度就大多了,將會有顯著的效率提高。4.根據業務場景建立覆蓋...
Oracle中SQL效能優化(持續更新)
decode函式相當於case when 但是decode從效率上來講是強於case when的,但是從個人使用的角度來說case when的使用可以更加多樣化,這一點強於decode,兩者的選擇還是從現實中抉擇。刪除資料的角度來說,可以使用 truncate和delete和drop,從效率來說tr...