優(yōu)化,提高速度
2024-07-21 02:39:13
供稿:網(wǎng)友
最近的一個項目,需要對幾個超過千萬的表進行計算,JION,復(fù)雜查詢等操作,覺得SQL語句的優(yōu)化非常重要,把一些心得寫得出,希望同行們能糾正我的錯誤。
---與SQL優(yōu)化(包括內(nèi)存空間)有關(guān)一些INIT參數(shù)
OPTIMIZER_MODE
SORT_AREA
SHARED_POOL_SZIE
---一些不使用索引的情況
1,NOT IN
2,NOT BETWEEN
3,LIKE(第一個字符非%號除外,如name like '李%')
4,<>
5,IS NULL/IS NOT NULL
6,查詢的字段加函數(shù)
7,在8I中,多字段的組合索引(A,B,C),select * from ** wher B='33',則索引也不會用。(按前綴式規(guī)則使用索引除外,如A='33' and B='33' A='33' A='33' and C='33')
注:9I除外
---查詢語句比較優(yōu)化的寫法:
1,加HINT,改變其執(zhí)行路徑
2,可能使用exsit的地方就盡量不用IN,可以使用not exiist的地方,盡量不要用not in
3,兩個表進行JION時,大表放在前面,JION字段建索引
4,盡量用其它寫法,取代NOT IN,如a,b表同結(jié)構(gòu),數(shù)據(jù)量很大,則代替select * from a where a.c not in (select c from b )
的語句有
a)select a.* from a, b where a.c = b.c + and b.c is null(據(jù)說速度比原寫法提高30倍)
b)select * from a minus select a.* from a,b where a.c=b.c (速度其次)
c)select * from a where not exist(select a.* from a,b where a.c=b.c) (也不錯)
5,動態(tài)SQL中,盡量多用execute immediate,而少用DBMS_SQL,前者綜合效率優(yōu)于后者
6,對于很復(fù)雜的查詢語句,可以建立臨時表進行緩沖(關(guān)于臨時表的解釋與使用,還希望同行告訴我在哪里有。。。)
7,COUNT(*)與COUNT(某列)一樣進行全表掃描Fast Full Index Scan,速度差不多
8,經(jīng)常同時存取多列,或經(jīng)常使用GROUP BY的SQL語句,最好對表的GROUP字段建立組合索引。組合索引要盡量使要害查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。
9,對于字段取值單一(如性別字段只有男與女),而經(jīng)常在性別上做查詢,則建立位圖索引。
注:BITMAP INDEX通常用于DSS,假如你的系統(tǒng)是OLTP,DML操作將LOCK整個BITMAP SEGMENT,因此只在DSS下 考慮BITMAP INDEX