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