1.避免使用count(*)得到表的記錄數java
(1)爲了得到表中的記錄數,咱們一般使用下面的SQL語句:sql
SELECT COUNT(*) FROM dbo.orders
這條語句會執行全表掃描才能得到行數。oracle
(2)但下面的SQL語句不會執行全表掃描同樣能夠得到行數:函數
SELECT rows FROM sysindexes WHERE id =OBJECT_ID('dbo.Orders') AND indid <2
2.使用union實現or操做性能
(1)在查詢中儘可能不要使用or,使用union合併兩個不一樣的查詢結果集,這樣查詢性能會更好;spa
(2)若是不是必需要不一樣的結果集,使用union all效果會更好,由於它不會對結果集排序。code
3.索引問題排序
法則:不要在創建的索引的數據列上進行下列操做:索引
◆避免對索引字段進行計算操做io
◆避免在索引字段上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出現數據類型轉換
◆避免在索引字段上使用函數
◆避免創建索引的列中使用空值。
4.NOT IN操做符
此操做是強列推薦不使用的,由於它不能應用表的索引。
推薦方案:用NOT EXISTS 或(外鏈接+判斷爲空)方案代替
5.<> 操做符(不等於)
不等於操做符是永遠不會用到索引的,所以對它的處理只會產生全表掃描。
推薦方案:用其它相同功能的操做運算代替,如
a<>0 改成 a>0 or a<0
a<>’’ 改成 a>’’
IS NULL 或IS NOT NULL操做(判斷字段是否爲空)
判斷字段是否爲空通常是不會應用索引的,由於B樹索引是不索引空值的。
6.LIKE操做符
LIKE操做符能夠應用通配符查詢,裏面的通配符組合可能達到幾乎是任意的查詢,可是若是用得很差則會產生性能上的問題,如LIKE ‘%5400%’ 這種查詢不會引用索引,而LIKE ‘X5400%’則會引用範圍索引。一個實際例子:用YW_YHJBQK表中營業編號後面的戶標識號可來查詢營業編號 YY_BH LIKE ‘%5400%’ 這個條件會產生全表掃描,若是改爲YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 則會利用YY_BH的索引進行兩個範圍的查詢,性能確定大大提升。
7.用EXISTS替換DISTINCT:
當提交一個包含一對多表信息(好比部門表和僱員表)的查詢時,避免在SELECT子句中使用DISTINCT. 通常能夠考慮用EXIST替換, EXISTS 使查詢更爲迅速,由於RDBMS核心模塊將在子查詢的條件一旦知足後,馬上返回結果. 例子:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E
WHERE D.DEPT_NO = E.DEPT_NO
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
8. sql語句用大寫的;由於oracle老是先解析sql語句,把小寫的字母轉換成大寫的再執行