sql語法優化

2021-06-12 20:17:27 字數 2824 閱讀 4166

1、sql語句優化

1.1、

多表查詢時,記錄數少的表放到後面。

oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表將被最先處理。在from子句中包含多個表的情況下,將記錄數最少的表放到where的最後。

例:select count(*) from tablea,tableb;(tablea 100萬條,tableb 1萬條)

例:當三張表關聯查詢時,應將交叉表放到後面,其次是記錄少的表:

select count(1) from tablea a,tableb b,tablec c where c.id = a.id and c.id = b.id;

1.2、

where子句中盡量不用is null或is not null。

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

1.3、

萬用字元(%)在索引字段詞首出現時會降低效率。

當萬用字元在索引字段詞首出現時,oracle是不是用此列做索引的,如此會降低查詢速度。但是當萬用字元出現在此字段其他位置時,優化器就能利用索引,下列語句索引起到了作用。

select * from employee where last_name like 『c%』;

1.4、

select子句中避免使用」*」。

1.5、

避免在索引上使用計算。如(where sal > 2500/12)

1.6、

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

1.7、

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

1.8、

減少訪問資料庫的次數。

如查詢員工號等於0342或0291的員工資訊:

第一種查詢方法:

select * from emp where emp_no = 『0342』;

select * from emp where emp_no = 『0291』;

第二種查詢方法:

select * from emp where emp_no = 『0342』 or emp_no = 『0291』;

1.9、

關於char和varchar2的使用。

char的長度是固定的,而varchar2的長度是可變的;一般char比varchar2效率高。

但varchar2比char節省磁碟空間,在節省很多空間情況下varchar2也會比char效率高。

1.10、

一般情況下,如果欄位中含有中文字元用nchar或nvarchar2;如果是純英文和數字用char或varchar2。

1.11、

少用或不用not。

不等於操作永遠不會用到索引的,只會全表掃瞄。

不推薦使用:select * from emp where sal <> 3000;

推薦使用:select * from emp where sal < 3000 or sal > 3000;

1.12、

in和exists

in:子查詢先產生結果集,然後主查詢再去結果集裡去找符合要求的字段列表去,符合要求的輸出,反之則不輸出。如果子查詢得出的結果集記錄少,主查詢中的表大且有索引時應該用in。

select * from tablea where x in(select y from tableb);

以上語句適合tableb記錄少,tablea記錄多且有索引的情況。

exists:後面的子查詢被稱做相關子查詢。他是不返回列表的值的,只是返回乙個ture或false的結果,其執行方式是先執行主查詢一次,再去子查詢裡查詢與其對應的結果,如果是ture則輸出,反之則不輸出,再根據主查詢中的每一行去子查詢裡去查詢。如果外層主查詢記錄少,子查詢中的表大又有索引時使用exists。

select * from tablea a where exists(select * from tableb b where b.id = a.id);

以上語句適合tablea記錄少,tableb記錄多且有索引的情況。

1.13、

decode:(避免重複掃瞄相同記錄或重複連線相同表)

從員工表中查詢每個部門的員工數及工資總和。

不推薦:

select count(*),sum(sal) from emp where dept_no = 『0020』;

select count(*),sum(sal) from emp where dept_no = 『0030』;

推薦:select count(decode(dept_no,0020,』x』,null)) count_0020,

count(decode(dept_no,0030,』x』,null)) count_0030,

sum(decode(dept_no,0020,sal,null)) sal_0020,

sum(decode(dept_no,0030,sal,null)) sal_0030

from emp;

1.14、

高效刪除重覆記錄:

delete from emp e where e.rowid >

(select min(m.rowid) from emp m where m.emp_no = e.emp_no);

rowid

用來唯一標識表中的一條記錄,是這條資料在資料庫中存放的實體地址

.1.15、

pl/sql developer中expain plan

在pl/sql developer工具中有個expain plan分析的功能,可以幫助我們分析sql語句是否用來索引、使用了那些索引和使用索引的效果。

sql特殊語法

複製表的結構 select into newtable from oldtable where 1 1 複製表達額內容 insert into new table select 列名 from oldtable datediff函式用法 作用 返回兩個日期之間的間隔。語法 datediff date...

sql 語法細節

一 left join select a.mp id,a.pc id,sum cap plan qty as preplancumqty from master plan pc a where a.cap plan date startdate and a.mp id mp id group by ...

SQL基本語法

update 有關update,急!在oracle資料庫中 表 a id firstname,lastname 表 b id,lastname 表 a 中原來id,firstname兩個欄位的資料是完整的 表 b中原來id,lastname兩個欄位的資料是完整的 現在要把表 b中的lastname欄...