婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解

Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解

熱門標(biāo)簽:征服者火車站地圖標(biāo)注 word地圖標(biāo)注方向 人工智能地圖標(biāo)注自己能做嗎 美圖秀秀地圖標(biāo)注 阿爾巴尼亞地圖標(biāo)注app 開封智能外呼系統(tǒng)廠家 外呼線路外顯本地號(hào)碼 百度地圖標(biāo)注素材 征服眼公司地圖標(biāo)注

1:在進(jìn)行多表關(guān)聯(lián)時(shí),多用 Where 語句把單個(gè)表的結(jié)果集最小化,多用聚合函數(shù)匯總結(jié)果集后再與其它表做關(guān)聯(lián),以使結(jié)果集數(shù)據(jù)量最小化
2:在兩張表進(jìn)行關(guān)聯(lián)時(shí),應(yīng)考慮可否使用右連接。以提高查詢速度
3:使用 where 而不是 having ,where是用于過濾行的,而having是用來過濾組的,因?yàn)樾斜环纸M后,having 才能過濾組,所以盡量用戶 WHERE 過濾
4:使用 exists 而不用 IN 因?yàn)?Exists 只檢查行的存在,而 in 檢查實(shí)際值。
5:IN操作符
用 IN 寫出來的 SQL 的優(yōu)點(diǎn)是比較容易寫及清晰易懂,這比較適合現(xiàn)代軟件開發(fā)的風(fēng)格。
但是用 IN 的 SQL 性能總是比較低,原因是:
對(duì)于用 IN 的 SQL 語句 ORACLE 總是試圖將其轉(zhuǎn)換成多個(gè)表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行 IN
里面的子查詢,再查詢外層的表記錄
如果轉(zhuǎn)換成功就轉(zhuǎn)換成多個(gè)表的連接。因此 不管理怎么,用 IN 的 SQL 語句總是多了 一個(gè)轉(zhuǎn)換的
過程。一般的 SQL 都可以轉(zhuǎn)換成功。
但對(duì)于含有分組統(tǒng)計(jì)等方面的 SQL 就不能轉(zhuǎn)換了。因此在業(yè)務(wù)密集的SQL當(dāng)中盡量不采用IN操作符。
6:NOT IN 操作符
此操作強(qiáng)烈推薦不使用,因?yàn)槠洳荒軕?yīng)用表的索引。
如遇這種情況,應(yīng)該用 EXISTS ,NOT EXISTS 或者(外連接+判斷為空)方案代替。
7:> 操作符
不等于操作符是永遠(yuǎn)不會(huì)用到索引的,因此對(duì)它的處理只會(huì)產(chǎn)生全表掃描。
對(duì)于這種情況,可以用其它方式代替,如:
A>0 -> A>0 OR A0
A>'' -> A>''
8:like 操作符
遇到 需要用到 LIKE 過濾的SQL語句,完全可以用 instr 代替。處理速度將顯著提高。
9:union操作符
union在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,
刪除重復(fù)的記錄再返回結(jié)果。實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史
表union。如:

復(fù)制代碼 代碼如下:

select * from gc_dfys
union
select * from ls_jg_dfys

這個(gè)SQL在運(yùn)行時(shí)先取出兩個(gè)表的結(jié)果,再用排序空間進(jìn)行排序刪除重復(fù)的記錄,最后返回結(jié)果集,
如果表數(shù)據(jù)量大的話可能會(huì)導(dǎo)致用磁盤進(jìn)行排序。
推薦方案:采用union ALL操作符替代union,因?yàn)閡nion ALL操作只是簡單的將兩個(gè)結(jié)果合并后就返回。
復(fù)制代碼 代碼如下:

select * from gc_dfys
union all
select * from ls_jg_dfys

10 SQL書寫的影響
同一功能同一性能不同寫法SQL的影響
如一個(gè)SQL在A程序員寫的為
select * from zl_yhjbqk
B程序員寫的為
select * from dlyx.zl_yhjbqk(帶表所有者的前綴)
C程序員寫的為
select * from DLYX.ZLYHJBQK(大寫表名)
D程序員寫的為
select *  from DLYX.ZLYHJBQK(中間多了空格)
以上四個(gè)SQL在ORACLE分析整理之后產(chǎn)生的結(jié)果及執(zhí)行的時(shí)間是一樣的,但是從ORACLE共享內(nèi)存SGA的
原理,
可以得出ORACLE對(duì)每個(gè)SQL都會(huì)對(duì)其進(jìn)行一次分析,并且占用共享內(nèi)存,如果將SQL的字符串及格式寫
得完全相同則ORACLE只會(huì)分析一次,
共享內(nèi)存也只會(huì)留下一次的分析結(jié)果,這不僅可以減少分析SQL的時(shí)間,而且可以減少共享內(nèi)存重復(fù)的
信息,ORACLE也可以準(zhǔn)確統(tǒng)計(jì)SQL的執(zhí)行頻率。
11:where后面的條件順序影響
where子句后面的條件順序?qū)Υ髷?shù)據(jù)量表的查詢會(huì)產(chǎn)生直接的影響,如
復(fù)制代碼 代碼如下:

select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
select * from zl_yhjbqk where xh_bz=1  and dy_dj = '1KV以下'

以上兩個(gè)SQL中dy_dj(電壓等級(jí))及xh_bz(銷戶標(biāo)志)兩個(gè)字段都沒進(jìn)行索引,所以執(zhí)行的時(shí)候都
是全表掃描,
第一條SQL的dy_dj = '1KV以下'條件在記錄集內(nèi)比率為99%,而xh_bz=1的比率只為0.5%,
在進(jìn)行第一條SQL的時(shí)候99%條記錄都進(jìn)行dy_dj及xh_bz的比較,而在進(jìn)行第二條SQL的時(shí)候0.5%條記錄
都進(jìn)行dy_dj及xh_bz的比較,
以此可以得出第二條SQL的CPU占用率明顯比第一條低。
12:詢表順序的影響
在FROM后面的表中的列表順序會(huì)對(duì)SQL執(zhí)行性能影響,在沒有索引及ORACLE沒有對(duì)表進(jìn)行統(tǒng)計(jì)分析的
情況下ORACLE會(huì)按表出現(xiàn)的順序進(jìn)行鏈接,
由此因?yàn)楸淼捻樞虿粚?duì)會(huì)產(chǎn)生十分耗服務(wù)器資源的數(shù)據(jù)交叉。(注:如果對(duì)表進(jìn)行了統(tǒng)計(jì)分析,
ORACLE會(huì)自動(dòng)先進(jìn)小表的鏈接,再進(jìn)行大表的鏈接)
13:采用函數(shù)處理的字段不能利用索引,如:
復(fù)制代碼 代碼如下:

substr(hbs_bh,1,4)='5400',優(yōu)化處理:hbs_bh like ‘5400%'
trunc(sk_rq)=trunc(sysdate),優(yōu)化處理:
sk_rq>=trunc(sysdate) and sk_rqtrunc(sysdate+1)

進(jìn)行了顯式或隱式的運(yùn)算的字段不能進(jìn)行索引,如:
復(fù)制代碼 代碼如下:

ss_df+20>50,優(yōu)化處理:ss_df>30
‘X'||hbs_bh>'X5400021452',優(yōu)化處理:hbs_bh>'5400021542'
sk_rq+5=sysdate,優(yōu)化處理:sk_rq=sysdate-5
hbs_bh=5401002554,優(yōu)化處理:hbs_bh=' 5401002554',注:此條件對(duì)hbs_bh 進(jìn)行隱式的

to_number轉(zhuǎn)換,因?yàn)閔bs_bh字段是字符型。
條件內(nèi)包括了多個(gè)本表的字段運(yùn)算時(shí)不能進(jìn)行索引,如:
ys_df>cx_df,無法進(jìn)行優(yōu)化
qc_bh||kh_bh='5400250000',優(yōu)化處理:qc_bh='5400' and kh_bh='250000'
14:應(yīng)用ORACLE的HINT(提示)處理
提示處理是在ORACLE產(chǎn)生的SQL分析執(zhí)行路徑不滿意的情況下要用到的。它可以對(duì)SQL進(jìn)行以下方
面的提示
目標(biāo)方面的提示:
COST(按成本優(yōu)化)
RULE(按規(guī)則優(yōu)化)
CHOOSE(缺省)(ORACLE自動(dòng)選擇成本或規(guī)則進(jìn)行優(yōu)化)

SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
ALL_ROWS(所有的行盡快返回)
SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
FIRST_ROWS(第一行數(shù)據(jù)盡快返回)
select *
  from xxx 
 where xxx;
select *
  from xxx
 where xxx
優(yōu)化器提示:用它的目的是提高SQL語句的響應(yīng)時(shí)間,快速的先返回 n 行。
訪問路徑的提示
FULL: 執(zhí)行全表掃描
ROID: 根據(jù)ROWID進(jìn)行掃描
INDEX: 根據(jù)某個(gè)索引進(jìn)行掃描
select * from emp where deptno=200 and sal>300;
如果寫了多個(gè),則ORACLE自動(dòng)選擇最優(yōu)的哪個(gè)
select * from emp where deptno=200 and sal>300;
INDEX_JOIN: 如果所選的字段都是索引字段(是幾個(gè)索引的),那么可以通過索引連接就可訪問到數(shù)據(jù),而不需要訪問
表的數(shù)據(jù)。

select deptno,sal from emp
where deptno=20;
INDEX_FFS: 執(zhí)行快速全索引掃描

select count(*) from emp;
NO_INDEX: 指定不使用哪些索引

select * from emp where deptno=200
and sal>300;
AND_EQUAL: 指定合并兩個(gè)或以上索引檢索的結(jié)果(交集),最多不能超過5個(gè)

執(zhí)行方法的提示:
USE_NL(使用NESTED LOOPS方式聯(lián)合)
USE_MERGE(使用MERGE join方式聯(lián)合)
USE_HASH(使用HASH join方式聯(lián)合)

根據(jù)表出現(xiàn)在FROM中的順序,ORDERED使ORACLE依此順序?qū)ζ溥B接.
例如:
SELECT A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C
WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

將指定表與嵌套的連接的行源進(jìn)行連接,并把指定表作為內(nèi)部表.
例如:
SELECT BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM
FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

將指定的表與其他行源通過合并排序連接方式連接起來.
例如:
SELECT * FROM BSEMPMS,BSDPTMS
WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

將指定的表與其他行源通過哈希連接方式連接起來.
例如:
SELECT * FROM BSEMPMS,BSDPTMS
WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 
其它高級(jí)提示(如并行處理等等)
ORACLE的提示功能是比較強(qiáng)的功能,也是比較復(fù)雜的應(yīng)用,并且提示只是給ORACLE執(zhí)行的一個(gè)建議,
有時(shí)如果出于成本方面的考慮ORACLE也可能不會(huì)按提示進(jìn)行。根據(jù)實(shí)踐應(yīng)用,一般不建議開發(fā)人員應(yīng)用ORACLE提示,
因?yàn)楦鱾€(gè)數(shù)據(jù)庫及服務(wù)器性能情況不一樣,很可能一個(gè)地方性能提升了,但另一個(gè)地方卻下降了,
ORACLE在SQL執(zhí)行分析方面已經(jīng)比較成熟,如果分析執(zhí)行的路徑不對(duì)首先應(yīng)在數(shù)據(jù)庫結(jié)構(gòu)(主要是索引)、
服務(wù)器當(dāng)前性能(共享內(nèi)存、磁盤文件碎片)、數(shù)據(jù)庫對(duì)象(表、索引)統(tǒng)計(jì)信息是否正確這幾方面分析。

您可能感興趣的文章:
  • Oracle之SQL語句性能優(yōu)化(34條優(yōu)化方法)
  • Oracle數(shù)據(jù)庫中基本的查詢優(yōu)化與子查詢優(yōu)化講解
  • 關(guān)于Oracle多表連接,提高效率,性能優(yōu)化操作

標(biāo)簽:葫蘆島 宜春 泰安 酒泉 孝感 六安 海北 淮南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解》,本文關(guān)鍵詞  Oracle,查詢,優(yōu)化,的,基本,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 沁阳市| 柏乡县| 南岸区| 金川县| 民县| 贡嘎县| 井冈山市| 灵台县| 江山市| 虎林市| 定边县| 无棣县| 同仁县| 枝江市| 济宁市| 松溪县| 横峰县| 临西县| 新丰县| 内丘县| 南涧| 宁海县| 长宁县| 象山县| 赤壁市| 家居| 枣阳市| 青神县| 大同县| 南靖县| 江津市| 班戈县| 青海省| 阜阳市| 黔东| 大荔县| 大渡口区| 新郑市| 边坝县| 武平县| 德令哈市|