濮阳杆衣贸易有限公司

主頁 > 知識庫 > Oracle 語句優(yōu)化分析說明第1/2頁

Oracle 語句優(yōu)化分析說明第1/2頁

熱門標簽:地圖標注付款了怎么找不到了 沈陽400電話是如何辦理 外呼系統(tǒng)口號 百度地圖標注員是干什么 外呼系統(tǒng)鄭州 貴陽智能電銷機器人官網(wǎng) 溫州人工外呼系統(tǒng) 北京外呼系統(tǒng)公司排名 北京營銷外呼系統(tǒng)廠家
1. ORACLE 的解析器按照從右到左的順序處理 FROM 子句中的表名,因此 FROM 子句中寫在最后的表(基礎(chǔ)表 driving table)將被最先處理。在 FROM 子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表。
例如:
表 TAB1 16,384 條記錄
表 TAB2 1 條記錄
選擇 TAB2作為基礎(chǔ)表 (最好的方法)
select count(*) from tab1,tab2 執(zhí)行時間 0.96秒
選擇 TAB2作為基礎(chǔ)表 (不佳的方法)
select count(*) from tab2,tab1 執(zhí)行時間 26.09秒
2. ORACLE 采用自下而上的順序解析 WHERE 子句,根據(jù)這個原理,表之間的連接必須寫在其他 WHERE 條件之前, 那些可以過濾掉最大數(shù)量記錄的條件必須寫在 WHERE 子句的末尾。
例如:
(低效,執(zhí)行時間 156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER'
AND 25 (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,執(zhí)行時間 10.6秒)
SELECT …
FROM EMP E
WHERE 25 (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER';
3. SELECT子句中避免使用'*'
當你想在 SELECT子句中列出所有的 COLUMN時,使用動態(tài) SQL列引用 ‘*' 是一個方便的方法。不幸的是,這是一個非常低效的方法。 實際上,ORACLE 在解析的過程中,會將‘*' 依次轉(zhuǎn)換成所有的列名, 這個工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費更多的時間。
4. 使用DECODE 函數(shù)來減少處理時間, 使用 DECODE 函數(shù)可以避免重復掃描相同記錄或重復連接相同的表。
5. 刪除重復記錄
最高效的刪除重復記錄方法 ( 因為使用了 ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);
6. 計算記錄條數(shù)
和一般的觀點相反,count(*) 比 count(1)稍快,當然如果可以通過索引檢索,對索
引列的計數(shù)仍舊是最快的。 例如 COUNT(EMPNO)
7. 用WHERE子句替換HAVING子句
避免使用 HAVING子句,HAVING 只會在檢索出所有記錄之后才對結(jié)果集進行過濾。
這個處理需要排序,總計等操作。 如果能通過 WHERE 子句限制記錄的數(shù)目,那就能減少這方面的開銷。
例如:
低效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY'
AND REGION != ‘PERTH'
高效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY'
AND REGION != ‘PERTH'
GROUP BY REGION
HAVING 中的條件一般用于對一些集合函數(shù)的比較,如 COUNT() 等等。除此而外,一般的條件應該寫在 WHERE 子句中。
8. 減少對表的查詢
在含有子查詢的 SQL語句中,要特別注意減少對表的查詢。
例如:
低效
SELECT TAB_NAME
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
9. 使用表的別名ALIAS
當在 SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個 Column上。這
樣一來,就可以減少解析的時間并減少那些由 Column歧義引起的語法錯誤。
(Column歧義指的是由于 SQL中不同的表具有相同的 Column名,當 SQL語句中出現(xiàn)這個 Column時,SQL解析器無法判斷這個 Column的歸屬)
10. 用EXISTS替代IN
在許多基于基礎(chǔ)表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯(lián)接。在這
種情況下, 使用 EXISTS(或 NOT EXISTS)通常將提高查詢的效率。
低效:
SELECT *
FROM EMP (基礎(chǔ)表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB')
高效:
SELECT *
FROM EMP (基礎(chǔ)表)
WHERE EMPNO > 0
AND EXISTS (SELECT ‘X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB')
11. 用NOT EXISTS替代 NOT IN
在子查詢中, NOT IN子句將執(zhí)行一個內(nèi)部的排序和合并。 無論在哪種情況下, NOT IN都是最低效的 (因為它對子查詢中的表執(zhí)行了一個全表遍歷)。 為了避免使用 NOT IN ,我們可以把它改寫成外連接(Outer Joins)或 NOT EXISTS.
例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT
WHERE DEPT_CAT='A');
為了提高效率。改寫為:
(方法一: 高效)
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = ‘A'
(方法二: 最高效)
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X'
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A');
12. 用表連接替換EXISTS
通常來說 ,采用表連接的方式比 EXISTS 更有效率
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT ‘X'
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A');
(更高效)
SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = ‘A' ;
13. 用EXISTS替換DISTINCT
當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在 SELECT 子句
中使用 DISTINCT. 一般可以考慮用 EXIST 替換
例如:
低效:
SELECT DISTINCT DEPT_NO,DEPT_N
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);
14. 避免在索引列上使用計算
WHERE 子句中,如果索引列是函數(shù)的一部分。優(yōu)化器將不使用索引而使用全表掃描。
舉例:
低效:
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;
高效:
SELECT …
FROM DEPT
WHERE SAL > 25000/12;
:這是一個非常實用的規(guī)則,請務(wù)必牢記
12下一頁閱讀全文
您可能感興趣的文章:
  • Oracle性能究極優(yōu)化 下
  • Oracle性能究極優(yōu)化
  • Oracle性能究極優(yōu)化(Oracle 性能優(yōu)化)
  • Oracle SQL性能優(yōu)化系列學習三
  • Oracle SQL性能優(yōu)化系列學習二
  • Oracle SQL性能優(yōu)化系列學習一
  • Oracle數(shù)據(jù)庫及應用程序優(yōu)化開發(fā)者網(wǎng)絡(luò)Oracle
  • Oracle數(shù)據(jù)庫性能優(yōu)化技術(shù)開發(fā)者網(wǎng)絡(luò)Oracle
  • oracle 優(yōu)化的一點體會
  • oracle 性能優(yōu)化建議小結(jié)
  • oracle下一條SQL語句的優(yōu)化過程(比較詳細)
  • oracle數(shù)據(jù)庫sql的優(yōu)化總結(jié)
  • Oracle數(shù)據(jù)庫優(yōu)化策略總結(jié)篇

標簽:淮北 潮州 溫州 包頭 通遼 衡水 定西 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Oracle 語句優(yōu)化分析說明第1/2頁》,本文關(guān)鍵詞  Oracle,語句,優(yōu)化,分析,說明,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle 語句優(yōu)化分析說明第1/2頁》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle 語句優(yōu)化分析說明第1/2頁的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    株洲县| 天等县| 寿宁县| 科技| 密云县| 同德县| 攀枝花市| 鹤峰县| 临泉县| 安龙县| 仙居县| 乌鲁木齐县| 肃宁县| 平顶山市| 隆子县| 和林格尔县| 浙江省| 陆良县| 香港| 潮州市| 顺平县| 晋中市| 淄博市| 上思县| 凤凰县| 岳池县| 九龙坡区| 自贡市| 威远县| 台州市| 巴彦县| 扶沟县| 林州市| 右玉县| 正定县| 玉门市| 临桂县| 兰坪| 和林格尔县| 富源县| 乌拉特前旗|