當前位置:首頁 » 課程設計 » oraclesql優化課程

oraclesql優化課程

發布時間: 2021-01-31 19:23:49

Ⅰ oracle sql優化要如何自學

空間、效率、代碼你要優化那一塊,我也想學學優化。

Ⅱ oracle plsql 如何優化sql

不+ where 條件 的查詢語句 oracle 的查詢優化器 會自動在 查詢的過程中優化你的查詢語句,你寫了where 條件之後 如果查詢的欄位沒有索引,查詢優化器是不做任何優化的。

Ⅲ oracle中如何優化sql語句的,用什麼方法

2. 選擇最有效率的表名順序(只在基於規則的優化器中有效)
ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當ORACLE處理多個表時, 會運用排序及合並的方式連接它們.首先,掃描第一個表(FROM子句中最後的那個表)並對記錄進行派序,然後掃描第二個表(FROM子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合並.
例如: 表 TAB1 16,384 條記錄
表 TAB2 1 條記錄
選擇TAB2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇TAB2作為基礎表 (不佳的方法)
select count(*) from tab2,tab1 執行時間26.09秒
如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
例如: EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
將比下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
3. WHERE子句中的連接順序.
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
例如:
(低效,執行時間156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = 『MANAGER』
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,執行時間10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = 『MANAGER』;
4. SELECT子句中避免使用 『 * 『
當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用 『*』 是一個方便的方法.不幸的是,這是一個非常低效的方法. 實際上,ORACLE在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間.

5. 減少訪問資料庫的次數
當執行每條SQL語句時, ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變數 , 讀數據塊等等. 由此可見, 減少訪問資料庫的次數 , 就能實際上減少ORACLE的工作量.
例如,
以下有三種方法可以檢索出雇員號等於0342或0291的職員.
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1;
END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次資料庫訪問的檢索數據量 ,建議值為200.
6. 使用DECODE函數來減少處理時間
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE 『SMITH%』;
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE 『SMITH%』;
你可以用DECODE函數高效地得到相同結果
SELECT COUNT(DECODE(DEPT_NO,0020,』X』,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,』X』,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE 『SMITH%』;
類似的,DECODE函數也可以運用於GROUP BY 和ORDER BY子句中.

7. 用TRUNCATE替代DELETE
當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(准確地說是恢復到執行刪除命令之前的狀況)
而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行後,數據不能被恢復.因此很少的資源被調用,執行時間也會很短.
TRUNCATE只在刪除全表或分區適用,TRUNCATE是DDL不是DML

8. 用Where子句替換HAVING子句
避免使用HAVING子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.
例如:
低效:
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 中的條件一般用於對一些集合函數的比較,如COUNT() 等等. 除此而外,一般的條件應該寫在WHERE子句中
9. 減少對表的查詢
在含有子查詢的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)
Update 多個Column 例子:
低效:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
高效:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
10. 通過內部函數提高SQL效率.
SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H
WHERE H.EMPNO = E.EMPNO
AND H.HIST_TYPE = T.HIST_TYPE
GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;
通過調用下面的函數可以提高效率.
FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2
AS
TDESC VARCHAR2(30);
CURSOR C1 IS
SELECT TYPE_DESC
FROM HISTORY_TYPE
WHERE HIST_TYPE = TYP;
BEGIN
OPEN C1;
FETCH C1 INTO TDESC;
CLOSE C1;
RETURN (NVL(TDESC,』?』));
END;

FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2
AS
ENAME VARCHAR2(30);
CURSOR C1 IS
SELECT ENAME
FROM EMP
WHERE EMPNO=EMP;
BEGIN
OPEN C1;
FETCH C1 INTO ENAME;
CLOSE C1;
RETURN (NVL(ENAME,』?』));
END;

SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),
H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)
FROM EMP_HISTORY H
GROUP BY H.EMPNO , H.HIST_TYPE;
經常在論壇中看到如 』能不能用一個SQL寫出….』 的貼子, 殊不知復雜的SQL往往犧牲了執行效率. 能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的
11. 使用表的別名(Alias)
當在SQL語句中連接多個表時, 請使用表的別名並把別名前綴於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤.
Column歧義指的是由於SQL中不同的表具有相同的Column名,當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬
12. 用EXISTS替代IN
在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率.
低效:
SELECT *
FROM EMP (基礎表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = 『MELB』)
高效:
SELECT *
FROM EMP (基礎表)
WHERE EMPNO > 0
AND EXISTS (SELECT 『X』
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = 『MELB』)
相對來說,用NOT EXISTS替換NOT IN 將更顯著地提高效率,下一節中將指出
13. 用NOT EXISTS替代NOT IN
在子查詢中,NOT IN子句將執行一個內部的排序和合並. 無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷). 為了避免使用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』);
14. 用表連接替換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』 ;
在RBO的情況下,前者的執行路徑包括FILTER,後者使用NESTED LOOP
15. 用EXISTS替換DISTINCT
當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換
例如:
低效:
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);
EXISTS 使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足後,立刻返回結果.
16. 基礎表的選擇

基礎表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問). 根據優化器的不同, SQL語句中基礎表的選擇是不一樣的.
如果你使用的是CBO (COST BASED OPTIMIZER),優化器會檢查SQL語句中的每個表的物理大小,索引的狀態,然後選用花費最低的執行路徑.
如果你用RBO (RULE BASED OPTIMIZER) , 並且所有的連接條件都有索引對應, 在這種情況下, 基礎表就是FROM 子句中列在最後的那個表.
舉例:
SELECT A.NAME , B.MANAGER
FROM WORKER A,
LODGING B
WHERE A.LODGING = B.LODING;
由於LODGING表的LODING列上有一個索引, 而且WORKER表中沒有相比較的索引, WORKER表將被作為查詢中的基礎表.

17. 多個平等的索引
當SQL語句的執行路徑可以使用分布在多個表上的多個索引時, ORACLE會同時使用多個索引並在運行時對它們的記錄進行合並, 檢索出僅對全部索引有效的記錄.
在ORACLE選擇執行路徑時,唯一性索引的等級高於非唯一性索引. 然而這個規則只有
當WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在優化器中的等級是非常低的.
如果不同表中兩個想同等級的索引將被引用, FROM子句中表的順序將決定哪個會被率先使用. FROM子句中最後的表的索引將有最高的優先順序.
如果相同表中兩個想同等級的索引將被引用, WHERE子句中最先被引用的索引將有最高的優先順序.
舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME,
FROM EMP
WHERE DEPT_NO = 20
AND EMP_CAT = 『A』;
這里,DEPTNO索引將被最先檢索,然後同EMP_CAT索引檢索出的記錄進行合並. 執行路徑如下:

TABLE ACCESS BY ROWID ON EMP
AND-EQUAL
INDEX RANGE SCAN ON DEPT_IDX
INDEX RANGE SCAN ON CAT_IDX

18. 等式比較和范圍比較
當WHERE子句中有索引列, ORACLE不能合並它們,ORACLE將用范圍比較.

舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT = 『A』;

這里只有EMP_CAT索引被用到,然後所有的記錄將逐條與DEPTNO條件進行比較. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDX

19. 不明確的索引等級

當ORACLE無法判斷索引的等級高低差別,優化器將只使用一個索引,它就是在WHERE子句中被列在最前面的.
舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.

SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT > 『A』;

這里, ORACLE只用到了DEPT_NO索引. 執行路徑如下:

TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX

我們來試一下以下這種情況:
SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';

INDEX_NAME UNIQUENES
------------------------------ ---------
EMPNO UNIQUE
EMPTYPE NONUNIQUE

SQL> select * from emp where empno >= 2 and emp_type = 'A' ;

no rows selected

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)

雖然EMPNO是唯一性索引,但是由於它所做的是范圍比較, 等級要比非唯一性索引的等式比較低!
20. 強制索引失效

如果兩個或以上索引具有相同的等級,你可以強制命令ORACLE優化器使用其中的一個(通過它,檢索出的記錄數量少) .

舉例:

SELECT ENAME
FROM EMP
WHERE EMPNO = 7935
AND DEPTNO + 0 = 10 /*DEPTNO上的索引將失效*/
AND EMP_TYPE || 『』 = 『A』 /*EMP_TYPE上的索引將失效*/

這是一種相當直接的提高查詢效率的辦法. 但是你必須謹慎考慮這種策略,一般來說,只有在你希望單獨優化幾個SQL時才能採用它.

這里有一個例子關於何時採用這種策略,

假設在EMP表的EMP_TYPE列上有一個非唯一性的索引而EMP_CLASS上沒有索引.

SELECT ENAME
FROM EMP
WHERE EMP_TYPE = 『A』
AND EMP_CLASS = 『X』;

優化器會注意到EMP_TYPE上的索引並使用它. 這是目前唯一的選擇. 如果,一段時間以後, 另一個非唯一性建立在EMP_CLASS上,優化器必須對兩個索引進行選擇,在通常情況下,優化器將使用兩個索引並在他們的結果集合上執行排序及合並. 然而,如果其中一個索引(EMP_TYPE)接近於唯一性而另一個索引(EMP_CLASS)上有幾千個重復的值. 排序及合並就會成為一種不必要的負擔. 在這種情況下,你希望使優化器屏蔽掉EMP_CLASS索引.
用下面的方案就可以解決問題.
SELECT ENAME
FROM EMP
WHERE EMP_TYPE = 『A』
AND EMP_CLASS||』』 = 『X』;

21. 避免在索引列上使用計算.
WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.

舉例:

低效:
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000;

高效:
SELECT …
FROM DEPT
WHERE SAL > 25000/12;

這是一個非常實用的規則,請務必牢記

22. 自動選擇索引
如果表中有兩個以上(包括兩個)索引,其中有一個唯一性索引,而其他是非唯一性.
在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引.

舉例:
SELECT ENAME
FROM EMP
WHERE EMPNO = 2326
AND DEPTNO = 20 ;

這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來檢索記錄.
TABLE ACCESS BY ROWID ON EMP
INDEX UNIQUE SCAN ON EMP_NO_IDX

23. 避免在索引列上使用NOT
通常, 我們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的
影響. 當ORACLE」遇到」NOT ,!=,他就會停止使用索引轉而執行全表掃描.
舉例:

低效: (這里,不使用索引)

SELECT …
FROM DEPT
WHERE DEPT_CODE != 0;

高效: (這里,使用了索引)

SELECT …
FROM DEPT

知道的基本就這么多了,要加分啊~~O(∩_∩)O~

Ⅳ 推薦幾本關於oracle資料庫優化方面的好書

這幾本書不錯,你可以看看,參考來源:酷瓜書單

1. 《深入解析Oracle》 豆瓣評分內:8.7
只看頭兩章就已容經超出預期,的確物有所值。

2. 《Oracle DBA手記》 豆瓣評分:8
蓋國強、楊廷琨、熊軍等幾位牛人一起寫的,不解釋了。

3. 《Oracle資料庫性能優化》 豆瓣評分:7
實戰性很強。

4. 《Oracle性能診斷藝術》 豆瓣評分:9
書翻譯的不錯,是國內為數不多的針對sql性能診斷方面比較深入全面的書籍。

5. 《構建Oracle高可用環境》 豆瓣評分:8
淘寶首席DBA、Oracle ACE、ITpub版主陳吉平力作

Ⅳ 如何對Oracle sql 進行性能優化的調整

在SQL查詢中,為了提高查詢的效率,我們常常採取一些措施對查詢語句進行SQL性能優化。本文我們總結了一些優化措施,接下來我們就一一介紹。
1.查詢的模糊匹配
盡量避免在一個復雜查詢裡面使用 LIKE '%parm1%'—— 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用。
解決辦法:
其實只需要對該腳本略做改進,查詢速度便會提高近百倍。改進方法如下:
a、修改前台程序——把查詢條件的供應商名稱一欄由原來的文本輸入改為下拉列表,用戶模糊輸入供應商名稱時,直接在前台就幫忙定位到具體的供應商,這樣在調用後台程序時,這列就可以直接用等於來關聯了。
b、直接修改後台——根據輸入條件,先查出符合條件的供應商,並把相關記錄保存在一個臨時表裡頭,然後再用臨時表去做復雜關聯。
2.索引問題
在做性能跟蹤分析過程中,經常發現有不少後台程序的性能問題是因為缺少合適索引造成的,有些表甚至一個索引都沒有。這種情況往往都是因為在設計表時,沒去定義索引,而開發初期,由於表記錄很少,索引創建與否,可能對性能沒啥影響,開發人員因此也未多加重視。然一旦程序發布到生產環境,隨著時間的推移,表記錄越來越多。這時缺少索引,對性能的影響便會越來越大了。
法則:不要在建立的索引的數據列上進行下列操作:
避免對索引欄位進行計算操作
避免在索引欄位上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現數據類型轉換
避免在索引欄位上使用函數
避免建立索引的列中使用空值
3.復雜操作
部分UPDATE、SELECT 語句 寫得很復雜(經常嵌套多級子查詢)——可以考慮適當拆成幾步,先生成一些臨時數據表,再進行關聯操作。
4.update
同一個表的修改在一個過程里出現好幾十次,如:

update table1 set col1=... where col2=...; update table1 set col1=... where col2=... ...

這類腳本其實可以很簡單就整合在一個UPDATE語句來完成(前些時候在協助xxx項目做性能問題分析時就發現存在這種情況)
5.在可以使用UNION ALL的語句里,使用了UNION
UNION 因為會將各查詢子集的記錄做比較,故比起UNION ALL ,通常速度都會慢上許多。一般來說,如果使用UNION ALL能滿足要求的話,務必使用UNION ALL。還有一種情況大家可能會忽略掉,就是雖然要求幾個子集的並集需要過濾掉重復記錄,但由於腳本的特殊性,不可能存在重復記錄,這時便應該使用 UNION ALL,如xx模塊的某個查詢程序就曾經存在這種情況,見,由於語句的特殊性,在這個腳本中幾個子集的記錄絕對不可能重復,故可以改用UNION ALL)。
6.在WHERE 語句中,盡量避免對索引欄位進行計算操作
這個常識相信絕大部分開發人員都應該知道,但仍有不少人這么使用,我想其中一個最主要的原因可能是為了編寫寫簡單而損害了性能,那就不可取了。9月份在對XX系統做性能分析時發現,有大量的後台程序存在類似用法,如:where trunc(create_date)=trunc(:date1),雖然已對create_date 欄位建了索引,但由於加了TRUNC,使得索引無法用上。此處正確的寫法應該是where create_date>=trunc(:date1) and create_date< pre=""><>或者是where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)。
注意:因between 的范圍是個閉區間(greater than or equal to low value and less than or equal to high value.),故嚴格意義上應該再減去一個趨於0的小數,這里暫且設置成減去1秒(1/(24*60*60)),如果不要求這么精確的話,可以略掉這步。
7.對Where 語句的法則
7.1 避免在WHERE子句中使用in,not in,or 或者having。
可以使用 exist 和not exist代替in和not in。
可以使用表鏈接代替 exist。Having可以用where代替,如果無法代替可以分兩步處理。
例子

SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN (SELECT CUSTOMER_NAME FROM CUSTOMER)
優化

SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist (SELECT CUSTOMER_NAME FROM CUSTOMER)

7.2 不要以字元格式聲明數字,要以數字格式聲明字元值。(日期同樣)否則會使索引無效,產生全表掃描。
例子使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
--不要使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = '7369'
8.對Select語句的法則
在應用程序、包和過程中限制使用select * from table這種方式。看下面例子
--使用
SELECT empno,ename,category FROM emp WHERE empno = '7369'
--而不要使用
SELECT * FROM emp WHERE empno = '7369'
9. 排序
避免使用耗費資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎 執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序。
10.臨時表
慎重使用臨時表可以極大的提高系統性能。
關於SQL性能優化的知識就介紹到這里了

Ⅵ ORACLE sql 優化問題 運行速度太慢 要40秒 主要慢在 SUM () 塊

關於優化,無非是
1. 增加索引,讓檢索語句盡可能使用索引
2. 調整sql語句,減少子查詢,目標也是盡可能使用索引
3. 當然,增加硬體配置,也是辦法
4. 合理的進行資料庫設計,將數據分開到不同存儲

Ⅶ ORACLE DBA 性能優化的視頻; 最好是講SQL優化 執行計劃等等的

【視頻教學:性能優化】Maclean Liu的Oracle性能優化講座第一回《真正讀懂Oracle SQL執行計劃》
【技術版分享】開Oracle調優鷹眼,深入理解權AWR性能報告 第一講 地址
【技術分享】開Oracle調優鷹眼,深入理解AWR性能報告 第二講
【AskMaclean技術分享Oracle資料庫優化】AWR鷹眼系列AWR報告全面指標分析

Ⅷ Oracle sql優化

oracle語法分析器,具體用到哪個索引,一般來說,不是我們自己能夠指定的。


這個和oracle的統計數據有關;


一般來說,如果你的條件界定出來的數據量占表的數據量很大的話,oracle不會使用這個索引。


另外,我認為:


whereake010>=to_date('2014-01-0100:00:00','yyyy-mm-ddhh24:mi:ss')ANDKC24.AKE010<=to_date('2014-01-3123:59:59','yyyy-mm-ddhh24:mi:ss')

不應該會用到 akb020,ake010 索引(注意欄位順序),除非你用 ak020 的查詢條件。


如果你確認 滿足 這個條件 的數據只佔表中的極少量的數據,並且沒有 ak020 的where條件的話,建議你:

  1. 重建這個索引

  2. 重建統計數據,這個我也不懂,你自己查一下

http://www.blogjava.net/envoydada/archive/2009/02/07/253698.html

Ⅸ ORACLE 如何優化SQL

SELECT TO_CHAR(時間欄位來,'YYYY-MM-DD') FROM 表 GROUP BY TO_CHAR(時間欄位,'YYYY-MM-DD') where 條件自;

加條件限制條數或加上指定時間段這樣速度會快一點。

Ⅹ 落落老師高級oracle sql優化班 怎麼樣

您好,很高興為您解答。

SQL優化簡介
一般在應用中, 糟糕的SQL語句是造成系統性能低下的最主要原因,例如大小寫的不統一、同樣的SQL語句不同的寫法等。而且,隨著數據量的增加,情況會變得越來越嚴重。(題外話:優秀的Oracle資料庫優化人才,是任何公司都稀缺的)

課程模塊 詳細章節內容
SQL高級優化
1 索引原理
2 基本概念
2.1 列基數與列選擇性(區別列基數與執行計劃的基數)
2.2 直方圖
2.3 集群因子
3 統計信息
3.1 統計信息的最佳采樣率
3.2 穩定系統收集統計信息最佳方法
3.3 如何查看統計信息是否過期
3.4 如何查看錶的采樣率
3.5 定製統計信息收集策略
3.6 快速檢測SQL語句中統計信息過期的表的腳本
4. 執行計劃
4.1 查看執行計劃的方法
4.2 解釋為什麼不要用工具(TOAL/PLSQL DEV/EM)等查看執行計劃
4.3 詳細解釋執行計劃,教你徹底讀懂執行計劃
4.4 游標移動法則閱讀執行計劃

5. 訪問路徑(這部分會結合等待事件詳細解釋)
6. 連接方式
6.1 徹底搞懂嵌套循環,如何判斷錯誤的嵌套循環
6.2 徹底搞懂哈希連接,如何優化哈希連接
6.3 徹底搞懂排序合並連接,什麼情況下必須用排序合並連接
6.4 徹底搞懂笛卡爾連接,如何判斷正確的笛卡爾連接,如何判斷錯誤的笛卡爾連接
6.5 徹底搞懂外連接,掌握外連接的如何影響SQL性能
6.6 徹底搞懂半連接,掌握半連接優化方法以及底層原理
6.7 徹底搞懂反連接,掌握反連接優化方法以及底層原理
6.8 徹底搞懂標量子查詢,掌握標量子查詢優化方法以及底層原理
7. 成本計算
7.1 你優化SQL還在看COST嗎?如果你還在看,說明你沒入門
7.2 為什麼COST很小,SQL卻跑得很慢?
7.3 手把手教你計算全表掃描cost
7.4 手把手教你計算索引掃描cost
7.5 手把手教你嵌套循環cost
8. 查詢轉換
8.1 徹底搞懂 FILTER 底層原理,如何判斷正確的FILTER,如何判斷錯誤的FILTER
8.2 什麼時候該用in/not in,什麼時候該用exists/not exists?
我看到某某書,某某網站,說什麼情況下用in,什麼情況下用exists
拋棄這些錯誤的結論吧,我們來研究它的底層原理
8.4 徹底搞懂subquery unnesting,掌握subquery unnesting優化技巧
8.5 徹底搞懂vier merge,掌握view merge 優化技巧
8.6 徹底搞懂pushing predicate,掌握pushing predicate 優化技巧
9. 優化技巧
9.1 查看執行計劃真實的基數
9.2 union代替or的情況
9.3 分頁語句優化技巧
9.4 利用分析函數優化SQL
9.5 超大表與超小表HASH JOIN優化方法
9.6 <>優化技巧
9.7 函數索引優化技巧
9.8 LIKE '%XXX%' 優化技巧
9.9 如何根據執行計劃建立索引?
9.10 組合索引怎麼選擇引導列?
10. SQL優化實戰(講課中也會出現一些案例)
10.1 收集統計信息,重建索引優化案例,如何發現統計信息過期?如何判斷索引需要重建?
10.2 組合索引優化案例
10.3 利用並行優化案例
10.4 基數估算不準優化案例
10.5 直方圖優化案例(嵌套循環優化案例)
10.6 with as優化經典案例
10.7 subquery unnesting 優化經典案例(多個)
10.8 view merge 優化經典案例
10.9 謂詞推入優化經典案例
10.10 Merge優化update 案例
10.11 亂用bitmap優化案例
10.12 利用11g新特徵擴展統計信息優化案例
10.13 利用分區優化SQL案例
10.14 利用local索引優化SQL案例
10.15 化整為零,各個擊破優化案例
10.16 利用rowid優化案例
10.17 手工分配HASH AREA,SORT AREA 優化案例
10.18 標量子查詢優化案例
10.19 利用ASH監控優化案例
10.20 分頁優化案例
10.21 物化視圖降低SQL性能案例
10.22 利用分析函數優化SQL案例
10.23 SQL優化高手之路---把你腦袋當成CBO
11.贈送一個經典表設計優化案例

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

熱點內容
幼師專業怎麼樣 發布:2021-03-16 21:42:13 瀏覽:24
音樂小毛驢故事 發布:2021-03-16 21:40:57 瀏覽:196
昂立中學生教育閘北 發布:2021-03-16 21:40:47 瀏覽:568
建築業一建報考條件 發布:2021-03-16 21:39:53 瀏覽:666
2017年教師資格注冊結果 發布:2021-03-16 21:39:49 瀏覽:642
中國教師資格證查分 發布:2021-03-16 21:39:41 瀏覽:133
踵什麼成語有哪些 發布:2021-03-16 21:38:20 瀏覽:962
東營幼師專業學校 發布:2021-03-16 21:35:26 瀏覽:467
機械電子研究生課程 發布:2021-03-16 21:33:36 瀏覽:875
杭州朝日教育培訓中心怎麼樣 發布:2021-03-16 21:33:28 瀏覽:238