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...