1.多表查詢時必須指定別名 防止新加字段有同名字段 導致報錯
2.子句中避免使用』』 在select子句中列出所有的column時,使用動態sql列引用select』』 是乙個方便的方法.不幸的是,這是乙個非常低效的方法. 實際上,oracle在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間
3.調整where字句中的連線順序
oracle 採用自下而上的順序解析where 子句,根據這個原理,表之間的連線必須寫在其他where 條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where 子句的末尾.
select ww from dcs_accumulationgold t where t.accountingdate1=123456
4.選擇最有效率的表名順序(只在基於規則的優化器中有效) oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理。在from子句中包含多個表的情況下,必須選擇記錄條數最少的表作為基礎表。
當oracle處理多個表時, 會運用排序及合併的方式連線它們
5.用union all替換union
當sql語句需要union兩個查詢結果集合時,即使檢索結果中不會有重複的記錄,如果使用union這兩個結果集 同樣會嘗試進行合併,然後在輸出最終結果前進行排序,因此如果可以判斷檢索結果中不會有重複的記錄時候,應 該用union all,這樣效率就會因此得到提高
6.限制結果集
要儘量減少返回的結果行,包括行數和字段列數,只提取必須要的字段。
返回的結果越大,意味著相應的sql語句的logical reads 就越大,對伺服器的效能影響就越大。乙個很不好的設計就是返回表的所有資料
7.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。
8.很多時候用 exists 代替 in 是乙個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
9.用not exists替代not in:
select * from dept1 where not exists (select 1 from emp1 where deptno=dept1.deptno); --0.015s
select * from temp_tab where table_name not in (select table_name from temp_col); --0.031s
10.用表連線替換exists:
select emp1. from emp1 where exists (select 1 from dept1 where deptno=emp1.deptno);–18.9s
select emp1. from emp1,dept1 where emp1.deptno=dept1.deptno; --18.002s**
11.使用decode函式替代case when then
用decode替換case when then 用法
case 列名
when '原來的值 』 then 『需要改變的值』
when 『原來的值』 then 『需要改變的值』
else 『需要改變的值』 end
select no,name,***,college,case ***
when 『男』 then 『1』
when 『女』 then 『2』
else 『3』 end
as 性別
from
student
decode理解如: if()else if()esle if()else
只比較乙個引數時
select id,decode(傳入參,比較值,equal值,not equal值)name from table;
比較多個引數時
select id,decode(傳入值,比較值1,equal值1,比較值2,equal值2,比較值3,equal值3,比較值4,equal值4)name from table;
1.在索引上使用計算
在where字句中,如果索引列是計算或者函式的一部分,dbms的優化器將不會使用索引而使用全表查詢,函式 屬於計算的一種,同時在in和exists中通常情況下使用exists,因為in不走索引
效率低:
select * from user where salary*22>11000(salary是索引列)
效率高:
select * from user where salary>11000/22(salary是索引列)
如果where語句中有多個字段,那麼可以考慮建立組合索引。
組合索引中字段的順序是非常重要的,越是唯一的字段越是要靠前。
查詢時必須包含前導列,否則會走全表掃瞄
另外,無論是組合索引還是單個列的索引,盡量不要選擇那些唯一性很低的字段。
比如說,在只有兩個值0和1的字段上建立索引沒有多大意義。
2.在 where 子句中使用!=或<>操作符,將引擎放棄使用索引而進行全表掃瞄。
3.在 where 子句中對字段進行 null 值判斷,將導致引擎放棄使用索引而進行全表掃瞄
如:select id from t where num is null
可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
4.在 where 子句中使用 or 來連線條件,將導致引擎放棄使用索引而進行全表掃瞄,
如:select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5.下面的查詢也將導致全表掃瞄:(不能前置百分號)
select id from t where name like 『%abc%』
若要提高效率,可以考慮全文檢索。
6.in 和 not in 也要慎用,否則會導致全表掃瞄,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7.在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。
如:select id from t where num/2=100
應改為:
select id from t where num=100*2
8.在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。
datediff用法
如:select id from t where substring(name,1,3)=』abc』–name以abc開頭的id
select id from t where datediff(day,createdate,』2005-11-30′)=0–』2005-11-30′生成的id
應改為:
select id from t where name like 『abc%』
select id from t where createdate >= 』2005-11-30′ and createdate < 』2005-12-1′
9.在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,系統將可能無法正確使用索引
SQL查詢語句優化
sql查詢語句優化的使用方法 查詢語句的優化是sql效率優化的乙個方式,可以通過優化sql語句來盡量使用已有的索引,避免全表掃瞄,從而提高查詢效率。最近在對專案中的一些sql進行優化,總結整理了一些方法。1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用selec...
sql查詢語句的優化
一 操作符優化 1 in 操作符 2 not in操作符 此操作是強列不推薦使用的,因為它不能應用表的索引。3 is null 或is not null操作 判斷字段是否為空 判斷字段是否為空一般是不會應用索引的,因為索引是不索引空值的。4 及 操作符 大於或小於操作符 大於或小於操作符一般情況下是...
SQL查詢語句優化指南
改進查詢的目標是提高查詢效率,改進查詢要綜合考慮多方面的因素,其基本點就是如何有效使用索引,沒有有效利用索引的查詢會造成全表掃瞄,當資料量很大時,查詢效率十分低下,甚至是不可接受的。下面列出了常用的查詢設計原則。總體原則 查詢優化器檢視查詢的每個字段,並決定對於限制需要掃瞄的資料量是否有用。如果乙個...