下面的例項中使用3個表 (table) a(r1,r2,r3,r4,r5,c1,c2,b2) b(r1,b1,b2) c(r1,c1,c2,b2),括號中即為表中的字段。
一、使用特定表中的索引。
有時候乙個表中的資料量很大時候,索引是非常非常的重要,何為索引?我來舉個例子,你一聽就能明白,比如:你想搜尋我的電腦中乙個名字為file.txt檔案,如果不知道該檔案所在的目錄(沒有建立索引)情況下,基本上要掃瞄我的電腦中的所有碟符裡的檔案,如果你的硬碟中的有很多檔案(相當乙個表中有很多的資料),基本上是乙個全盤掃瞄的過程,這時如果你告訴搜尋,你的檔案就在d盤的test目錄下,這樣來搜尋速度將會大大的提高,給檔案定位就相當乙個索引。
好了,知道索引是幹什麼之後,下面來看看怎麼走正確的索引,才能達到最高效。假如a表中有兩個索引idx_r1 index(r1,r2,r4,r5),idx_r3 index(r1,r3,r4,r5) 現在需要做這樣的操作,顯示表中的條件值是r1 = 1,r3 = 3,r4 =4的所有內容。通常我們會寫出下面的查詢語句。
select * from a where r1 =1 and r3 =3 and r4;
按道理它走的索引是idx_r3,有時候預設走的索引並不是你想象中的那樣,特別是多表關聯的情況下。所以我們進行指定一下索引,按我們真正想要的走的索引:
select /*+ index(r1,idx_r3) */* from a where r1 =1 and r3 =3 and r4;
二、在檢索資料的時候兩個表的關聯查詢效率低於使用exists子句。
select b.r1,b.b1,b.b2 from a,b where a.r1 = b.r1;
優化為:
select b.r1,b.b1,b.b2 from b where exists(select 1 from a where a.r1 = b.r1);
如果你在windows的oracle的平台可以使用pl/sql中的執行計畫(explain plan),看一下相應的執行時間進行驗證。
三、oracle的解析器是由右向左進行解析,所以在檢索兩個或以上表相關聯的資料的時候,將資料量小的表放到最後讓解析器優先解析。此方法在兩個表的資料相差很大的情況下,會有點效果。
四、 使用exists代替in子句,同理用not exists 代替not in
因為使用in子句作為乙個查詢條件後,oracle會將in子句的資料先搜尋出來以後,等結果集返回以後才作為乙個條件值。而exists語句是where語句之前的資料優先檢索完後在去檢索exists子句的內容。
五、如果有子句比較的情況下,將此比較語句放到where後作為第乙個條件。
如: select a.r2 from a where b.b2 = 3 and 2< select count(1) from b where b.r1 = a.r1; //效率較低
select a.r2 from a where 2< select count(1) from b where b.r1 = a.r1 and b.b2 = 3; //效率較高
六、在寫儲存過程的時候,無論是執行update,還是執行insert,應該盡快的commit。
七、在執行資料檢索的過程中近可能少的訪問同乙個表。
在寫儲存過程的時候,有時候因為條件值不一樣,通常需要多次的去訪問同乙個表,這個時候可以考慮乙個使用decode函式來代替多個條件。
//1
select sum(nvl(c2,0)) from c where r1 = 12 and c1 = 22 ;
//2
select sum(nvl(c2,0)) from c where r1 = 12 and c1 = 33 ;
優化方法:
select sum(decode(c1,22,c2,33,c2,0) from c where r1 =12 and c1 in(22,33);
八、在寫條件的時候盡量在條件值的左邊使用函式。
如: select * from a where to_char(r5,'yyyymm') = '200804'
應該使用
select * from a where r5 = to_date('200804','yyyymm');代替
九、update語句寫法提高效率。
update a
set c2 = (select max(c2) from c),
b2 = (select max(b2) from c)
where r1 = 1000;
高效:
update a
set (c2, b2)
= (select max(c2) , max(b2)
from c)
where r1 = 1000;
十、用exists替換distinct.
例如:
//低效:
select distinct c.r1,c.b2
from a,c
where a.r1 = c.r1 ;
//高效:
select c.r1,c.b2
from c
where exists ( select 『x』
from a
where a.r1 = c.r1);
exists 使查詢更為迅速,因為rdbms核心模組將在子查詢的條件一旦滿足後,立刻返回結果.
Oracle 語句優化
1 盡量少用in,基本上所有的in操作都可以用exists代替 2 用not exists或者外連線替代 not in,not in 不能應用索引 3 盡量不是用 amp 不等於操作符不會用到索引 2 用 2 or 2代替 4 設計表的時候把索引列設定為not null 5 盡量不把萬用字元 和 作...
oracle語句優化
1.多表查詢 選擇合適的基礎表 select from table1,table2,basetable選擇最有效率的表名順序 2.where子句中的連線順序 oracle採用自下而上的順序解析where子句。先寫表關聯後寫條件 過濾掉最大數量記錄的條件必須寫在where子句的末尾 3.計算記錄條數 ...
Oracle 優化 Like語句優化
1.盡量不要使用 like 2.對於like 可以用列的索引 3.對於like 以 開頭,不以 結尾 可以利用 反序列和函式索引 變成 like 4.查詢 like xx 應該使用函式instr string source,string xx 例如 select count from tb name...