關于SQL優化
1.建議不用“*”來代替所有列名
SELECT語句中可以用“*”來列出某個表的所有列名,但是這樣的寫法對Oracle系統來說會存在解析的動態問題。Oracle系統會通過查詢數據字典來將“*”轉換成表的所有列名,這自然會消耗系統時間。建議用戶在寫SELECT語句時,采用與訪問表有關的實際列名。
2.用TRUNCATE代替DELETE
當使用DELETE刪除表中的數據行時,Oracle會使用撤銷表空間(UNDO TABLESPACE)來存放恢復的信息。在這期間,如果用戶沒有發出COMMIT語句,而是發出ROLLBACK語句,Oracle系統會將數據恢復到刪除之前的狀態。當用戶使用TRUNCATE語句對表的數據進行刪除時,系統不會將被刪除的數據寫到回滾段(或撤銷表空間)中,速度當然要快得多。所以當希望對表或者簇中的所有行全部刪除時,采用TRUNCATE命令更加有效,其語法格式如下:
Truncate [table | cluster] schema.[table_name] [cluster_name] [drop | reuse storage]
3.在確保完整性的情況下多用COMMIT語句
在PL/SQL塊中,經常將幾個相互聯系的DML語句寫在一個BEGIN…END塊中,建議在每個塊的END前面使用COMMIT語句,這樣就可以實現對DML語句的及時提交,同時也釋放事務所占用的資源。
COMMIT所釋放的資源如下。
(1)回滾段上用于恢復數據的信息,撤銷表空間也只做短暫的保留
(2)被程序語句獲得的鎖
(3)redo log buffer中的空間
(4)Oracle為管理上述資源的內部花費
4.盡量減少表的查詢次數
在含有子查詢的SQL語句中,要特別注意減少對表的查詢,如下面的兩段代碼。
第一種:低效率的SQL查詢語句:
SQL> select empno,ename,job from emp
2 where deptno in (select deptno from dept where loc = 'BEIJING')
3 or deptno in (select deptno from dept where loc = 'NEW YORK');
第二種:對上面的代碼進行適當修改,高效率的SQL查詢語句如下:
SQL> select empno,ename,job from emp
2 where deptno in (select deptno from dept where loc = 'BEIJING' or loc = 'NEW YORK');
在“第一種”查詢語句中,要對dept表執行兩遍的查詢,而在“第二種”查詢中,僅對dept表執行一遍查詢。在大量數據的情況下,顯然“第二種”查詢要比“第一種”查詢快得多。
新聞熱點
疑難解答