Sql語句的優化查詢

2021-10-25 19:56:48 字數 4090 閱讀 8274

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查詢語句優化指南

改進查詢的目標是提高查詢效率,改進查詢要綜合考慮多方面的因素,其基本點就是如何有效使用索引,沒有有效利用索引的查詢會造成全表掃瞄,當資料量很大時,查詢效率十分低下,甚至是不可接受的。下面列出了常用的查詢設計原則。總體原則 查詢優化器檢視查詢的每個字段,並決定對於限制需要掃瞄的資料量是否有用。如果乙個...