1.選擇最有效率的表名順序(只在基於規則的優化器中有效)
oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理. 在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當oracle處理多個表時, 會運用排序及合併的方式連線它們.首先,掃瞄第乙個表(from子句中最後的那個表)並對記錄進行派序,然後掃瞄第二個表(from子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第乙個表中合適記錄進行合併.
例如:
表 tab1 16,384 條記錄
表 tab2 1 條記錄
選擇tab2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇tab2作為基礎表 (不佳的方法)
select count(*) from tab2,tab1 執行時間26.09秒
如果有3個以上的表連線查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
例如:
emp表描述了location表和category表的交集.
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 1000 and 2000
2. where子句中的連線順序.
oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.
例如:
(低效,執行時間156.3秒)
select …
from emp e
where sal > 50000
and job = 『manager'
and 25 < (select count(*) from emp
where mgr=e.empno);
(高效,執行時間10.6秒)
select …
from emp e
where 25 < (select count(*) from emp
where mgr=e.empno)
and sal > 50000
and job = 『manager';
3.. select子句中避免使用 『 * 『
當你想在select子句中列出所有的column時,使用動態sql列引用 『*' 是乙個方便的方法.不幸的是,這是乙個非常低效的方法. 實際上,oracle在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間.
4. 減少訪問資料庫的次數
當執行每條sql語句時, oracle在內部執行了許多任務作: 解析sql語句, 估算索引的利用率, 繫結變數 , 讀資料塊等等. 由此可見, 減少訪問資料庫的次數 , 就能實際上減少oracle的工作量.
例如,
以下有三種方法可以檢索出雇員號等於0342或0291的職員.
方法1 (最低效)
select emp_name , salary , grade
from emp
where emp_no = 342;
select emp_name , salary , grade
from emp
where emp_no = 291;
方法2 (次低效)
declare
cursor c1 (e_no number) is
select emp_name,salary,grade
from emp
where emp_no = e_no;
begin
open c1(342);
fetch c1 into …,..,.. ;
…..
open c1(291);
fetch c1 into …,..,.. ;
close c1;
end;
方法3 (高效)
select a.emp_name , a.salary , a.grade,
b.emp_name , b.salary , b.grade
from emp a,emp b
where a.emp_no = 342
and b.emp_no = 291;
效能優化 SQL優化
1.列型別盡量定義成數值型別,且長度盡可能短,如主鍵和外來鍵,型別字段等等 2.建立單列索引 3.根據需要建立多列聯合索引 當單個列過濾之後還有很多資料,那麼索引的效率將會比較低,即列的區分度較低,那麼如果在多個列上建立索引,那麼多個列的區分度就大多了,將會有顯著的效率提高。4.根據業務場景建立覆蓋...
SQL效能優化
postgre資料表資料比較多的情況下,使用模糊查詢效能很差,但是使用函式反而快了,返回資料一致,有點不解 warning表2688133條資料,warning message表6954788條資料 這個sql執行老半天都沒反映,耗時169904 ms select count 1 from war...
sql效能優化
任何平台的sql開發者都有自身的困惑,似乎他們一直糾纏在do while迴圈裡,這個迴圈讓他們不斷地重複同樣的錯誤。這是因為資料庫的發展依然不夠成熟。當然,商們也在不斷進步,但是他們還是需要處理更嚴重的問題。併發性,資源管理,空間管理和速度依然制約著sql開發者對開發平台的選擇。我並不期望sql開發...