SQL語句優化規律總結 ORACLE

2021-11-01 21:05:38 字數 2696 閱讀 2081

1、from: oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理. 在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表(放在where的最後) 。

如果有3個以上的表連線查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.

2、where: oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。

3、在where子句中使用is null或is not null的語句優化器是不允許使用索引的,盡量不用。

4、少使用或不使用not。

5、如果萬用字元(%)在搜尋詞首出現, oracle系統不使用此列做索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,萬用字元如此使用會降低查詢速度。然而當萬用字元出現在字串其他位置時,優化器就能利用索引。

在下面的查詢中索引得到了使用

select * from employee where last_name like 'c%';

6、 select子句中避免使用 『 * 『

7、避免在索引列上使用計算.如(where sal > 25000/12)

8、任何在order by語句的非索引項或者有計算表示式都將降低查詢速度。

9、關於in、exists和distinct

第一種格式是使用in操作符:

... where column in(select * from ... where ...);

第二種格式是使用exist操作符:

... where exists (select 'x' from ...where ...);

第二種格式要遠比第一種格式的效率高。

通常來說 , 採用表連線(的方式比exists更有效率

所以:連線>exists>in。

用exists替換distinct

當提交乙個包含一對多表資訊(比如部門表和雇員表)的查詢時,避免在select子句中使用distinct. 一般可以考慮用exist替換

低效:select distinct dept_no,dept_name

from dept d,emp e

where = class="txt">高效:

select dept_no,dept_name

from dept d

where exists ( select 『x』

from emp e

where = class="txt">10、下面的查詢將強迫對orders表執行順序操作:

select * from orders where (customer_num=104 and order_num>1001) or order_num=1008

雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序訪問路徑掃瞄整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:

select* from orders where customer_num=104 and order_num>1001

union

select * from orders where order_num=1008

這樣就能利用索引路徑處理查詢。

11、避免相關子查詢

乙個列的標籤同時在主查詢和where子句中的查詢**現,那麼很可能當主查

詢中的列值改變之後,子查詢必須重新查詢一次。查詢巢狀層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。

12、在預設情況下,oracle採用choose優化器, 為了避免那些不必要的全表掃瞄(full table scan) , 你必須盡量避免使用choose優化器,而直接採用基於規則或者基於成本的優化器.

13、一般情況下效能上:count(乙個索引字段) > count(*) > count(乙個非索引字段)

14、在select和where中盡量不要使用sysdate函式;因為它是每處理一行資料就要到系統中取一次系統時間;一般的解決的方法先把系統時間取出來當做乙個變數傳入:select sysdate from dual;

15.char的長度是固定的,而varchar2的長度是可以變化的;

char的效率比varchar2的效率稍高;

但varchar2比char節省磁碟空間。如磁碟空間節省的多;有時varchar2也會比char的效率稍高;看實際情況而定。

16.數字 — 長整型 number(11)

數字 — 位元組型 number(3)

數字 — 整型 number(5)

日期/時間 date date

布林型 number(1) 或 char(1)

精度型一般是 number(m,n),m是有效數字,n是小數點後的位數(預設0)

number預設是number(m,n); m=38,可以根據數字隨機適應;但占用磁碟空間大。

17.nchar,nvarchar2,nclob和char:varchar2, clob:

在utf-8的oracle資料庫時;最大char(4000);nchar(2000);

但乙個漢字char(3);nchar(1);

所以在漢字用的多和頻繁的文字時;建議用nchar();其它的clob;varchar2和char相似。

通過分析SQL語句的執行計畫優化SQL 總結

做dba快7年了,中間感悟很多。在dba的日常工作中,調整個別效能較差的sql語句時一項富有挑戰性的工 作。其中的關鍵在於如何得到sql語句的執行計畫和如何從sql語句的執行計畫中發現問題。總是想將日常 經驗的點點滴滴總結一下,但是直到最近才下定決心,總共花了3個週末時間,才將其整理成冊,便於自 己...

sql語句大全

建立資料庫 建立之前判斷該資料庫是否存在 if exists select from sysdatabases where name databasename drop database databasename gocreate database databasename 刪除資料庫 drop d...

SQL語句常用

1 新建資料庫aa createdatabaseaa 2 開啟資料庫aa opendatabaseaa 3 選擇aa為當前資料庫 setdatabasetoaa 4 修改資料庫aa modifydatabaseaa 5 刪除資料庫aa deletedatabaseaa 6 新建專案aa create...