怎么優(yōu)化Oracle語(yǔ)句 oracle簡(jiǎn)單優(yōu)化必做的調(diào)整

Oracle SQL語(yǔ)句優(yōu)化

試試這個(gè):

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、蘄春網(wǎng)站維護(hù)、網(wǎng)站推廣。

insert?into?mt_seal_inst

(detect_task_no,?bar_code,?seal_date,?write_date)

select?'DETECT_TASK_NO',

'strBarcode',

to_char(to_date(detect_date,?'yyyy-mm-dd?hh24:mi:ss')?+

numtodsinterval(3,?'second')),

to_char(to_date(detect_date,?'yyyy-mm-dd?hh24:mi:ss')?+

numtodsinterval(3,?'second'))

from?mt_detect_tmnl_rslt

where?bar_code?=?'strBarcode'?and?rownum=1;

還不行的話你再試試這個(gè):

insert?into?mt_seal_inst

(detect_task_no,?bar_code,?seal_date,?write_date)

with?t?as

(select?to_char(to_date(detect_date,?'yyyy-mm-dd?hh24:mi:ss')?+

numtodsinterval(3,?'second'))?col

from?mt_detect_tmnl_rslt

where?bar_code?=?'strBarcode'

and?rownum?=?1)

select?'DETECT_TASK_NO',?'strBarcode',?col,?col?from?t

你的表我沒(méi)有建沒(méi)試,有問(wèn)題你告訴我。

Oracle語(yǔ)句優(yōu)化規(guī)則匯總(9)

使用提示(Hints)

對(duì)于表的訪問(wèn) 可以使用兩種Hints FULL 和 ROWID

FULL hint 告訴ORACLE使用全表掃描的方式訪問(wèn)指定表

例如

SELECT?/*+?FULL(EMP)?*/?* FROM?EMP WHERE?EMPNO?=? ;

ROWID hint 告訴ORACLE使用TABLE ACCESS BY ROWID的操作訪問(wèn)表

通常 你需要采用TABLE ACCESS BY ROWID的方式特別是當(dāng)訪問(wèn)大表的時(shí)候 使用這種方式 你需要知道ROIWD的值或者使用索引

如果一個(gè)大表沒(méi)有被設(shè)定為緩存(CACHED)表而你希望它的數(shù)據(jù)在查詢結(jié)束是仍然停留在SGA中 你就可以使用CACHE hint 來(lái)告訴優(yōu)化器把數(shù)據(jù)保留在SGA中 通常CACHE hint 和 FULL hint 一起使用

例如

SELECT?/*+?FULL(WORKER)?CACHE(WORKER)*/?* FROM?WORK;

索引hint 告訴ORACLE使用基于索引的掃描方式 你不必說(shuō)明具體的索引名稱

例如

SELECT?/*+?INDEX(LODGING)?*/?LODGING FROM?LODGING WHERE?MANAGER?=? BILL?GATES ;

在不使用hint的情況下 以上的查詢應(yīng)該也會(huì)使用索引 然而 如果該索引的重復(fù)值過(guò)多而你的優(yōu)化器是CBO 優(yōu)化器就可能忽略索引 在這種情況下 你可以用INDEX hint強(qiáng)制ORACLE使用該索引

ORACLE hints 還包括ALL_ROWS FIRST_ROWS RULE USE_NL USE_MERGE USE_HASH 等等

使用hint 表示我們對(duì)ORACLE優(yōu)化器缺省的執(zhí)行路徑不滿意 需要手工修改 這是一個(gè)很有技巧性的工作 我建議只針對(duì)特定的 少數(shù)的SQL進(jìn)行hint的優(yōu)化 對(duì)ORACLE的優(yōu)化器還是要有信心(特別是CBO)

用WHERE替代ORDER BY

ORDER BY 子句只在兩種嚴(yán)格的條件下使用索引 ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序 ORDER BY中所有的列必須定義為非空 WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列

例如

表DEPT包含以下列

DEPT_CODE?PK?NOT?NULL DEPT_DESC?NOT?NULL DEPT_TYPE?NULL

非唯一性的索引(DEPT_TYPE)

低效 (索引不被使用)

SELECT?DEPT_CODE FROM?DEPT ORDER?BY?DEPT_TYPE EXPLAIN?PLAN SORT?ORDER?BY TABLE?ACCESS?FULL

高效 (使用索引)

SELECT?DEPT_CODE FROM?DEPT WHERE?DEPT_TYPE?? EXPLAIN?PLAN TABLE?ACCESS?BY?ROWID?ON?EMP INDEX?RANGE?SCAN?ON?DEPT_IDX

ORDER BY 也能使用索引! 這的確是個(gè)容易被忽視的知識(shí)點(diǎn) 我們來(lái)驗(yàn)證一下

SQL select * from emp order by empno Execution Plan ??? ????? SELECT STATEMENT Optimizer=CHOOSE   ??? ?? TABLE ACCESS (BY INDEX ROWID) OF EMP   ??? ???? INDEX (FULL SCAN) OF EMPNO (UNIQUE)

避免改變索引列的類型

當(dāng)比較不同數(shù)據(jù)類型的數(shù)據(jù)時(shí) ORACLE自動(dòng)對(duì)列進(jìn)行簡(jiǎn)單的類型轉(zhuǎn)換

假設(shè) EMPNO是一個(gè)數(shù)值類型的索引列

SELECT?… FROM?EMP WHERE?EMPNO?=?

實(shí)際上 經(jīng)過(guò)ORACLE類型轉(zhuǎn)換 語(yǔ)句轉(zhuǎn)化為

SELECT?… FROM?EMP WHERE?EMPNO?=?TO_NUMBER( )

幸運(yùn)的是 類型轉(zhuǎn)換沒(méi)有發(fā)生在索引列上 索引的用途沒(méi)有被改變

現(xiàn)在 假設(shè)EMP_TYPE是一個(gè)字符類型的索引列

SELECT?… FROM?EMP WHERE?EMP_TYPE?=?

這個(gè)語(yǔ)句被ORACLE轉(zhuǎn)換為

SELECT?… FROM?EMP WHERE?TO_NUMBER(EMP_TYPE)=

因?yàn)閮?nèi)部發(fā)生的類型轉(zhuǎn)換 這個(gè)索引將不會(huì)被用到!

lishixinzhi/Article/program/Oracle/201311/16677

如何優(yōu)化oracle查詢語(yǔ)句

like?'%a%'任何情況下都不會(huì)走索引。

寫出

substr(SSPCS,1,6)?between??'500101'?and??'500234'

并且建立函數(shù)索引。

PS:網(wǎng)上有說(shuō)like?'500112%'這種能通過(guò)索引查詢。

Oracle游標(biāo)sql語(yǔ)句代碼塊的優(yōu)化

游標(biāo)操作的優(yōu)化:

-- 有一個(gè)表格,存儲(chǔ)的是用戶的名字,將 emp 表中所有的用戶名轉(zhuǎn)換成小寫,再寫入這個(gè)表格

create table ename_emp(

ename varchar2(50)

);

-- 下面這個(gè)游標(biāo)的操作,需要 43s時(shí)間才能完成

declare

begin

for i in (select ename from emp_liebiao) loop

insert into ename_emp values(lower(i.ename));

commit;

end loop;

end;

-- 因?yàn)橛螛?biāo)是以行為單位進(jìn)行數(shù)據(jù)的操作的,所有游標(biāo)的效率是比較慢的,而且游標(biāo)需要消耗的內(nèi)存也是比較多的,我們需要將游標(biāo)以行進(jìn)行操作的方式,修改成一次性操作所有數(shù)據(jù)的批量的方式。

批量操作在游標(biāo)里面 叫做 bulk collect

第一步,創(chuàng)建一個(gè)表類型

type 表類型的名字 is table of 表名.列名 %type;

變量名 表類型的名字;

第三步,創(chuàng)建一個(gè)游標(biāo),讀取某個(gè)查詢的結(jié)果

cursor 游標(biāo)名字 is select 查詢語(yǔ)句 ;

第四步,打開(kāi)游標(biāo)

open 游標(biāo)名字;

第五步,捕獲游標(biāo)的數(shù)據(jù),將內(nèi)容給到表類型的變量進(jìn)行保存

fetch 游標(biāo)名字 bulk collect into 變量名字 ;

第六步,使用 forall 語(yǔ)句,對(duì)數(shù)據(jù)進(jìn)行批量的操作

forall i in 變量 .first .. 變量 .last DML 語(yǔ)句操作 ;

第七步,關(guān)閉游標(biāo)

close 游標(biāo)名字 ;

declare

-- 創(chuàng)建表類型

type biao is table of emp_liebiao.ename%type;

b biao;

-- 創(chuàng)建游標(biāo)

cursor m is select ename from emp_liebiao;

begin

-- 打開(kāi)游標(biāo)

open m;

-- 將游標(biāo)的內(nèi)容批量的給到變量

fetch m bulk collect into b;

-- 使用forall批量修改數(shù)據(jù)

forall i in b.first .. b.last insert into ename_emp values(lower(b(i)));

commit;

-- 關(guān)閉游標(biāo)

close m;

end;

練習(xí):批量修改用戶的編號(hào),讓編號(hào)+工資等級(jí)+部門,形成一個(gè)新的編號(hào),存入下面的表格中,使用 bulk collect 來(lái)實(shí)現(xiàn)。

2000以下是 C ,2000-3000是 B ,3000以上是 A ,

例如 SMITH , 新編號(hào)應(yīng)該是 7369_C_20

create table empno_emp(

empno varchar2(50)

);

declare

type biao is table of emp_liebiao%rowtype;

b biao;

cursor m is select * from emp_liebiao;

begin

open m;

fetch m bulk collect into b;

forall i in b.first..b.last

insert into empno_emp values(

b(i).empno||'_'||decode(sign(b(i).sal-2000)+sign(b(i).sal-3000),-2,'C',2,'A','B')||'_'||b(i).deptno

);

commit;

close m;

end;

網(wǎng)站名稱:怎么優(yōu)化Oracle語(yǔ)句 oracle簡(jiǎn)單優(yōu)化必做的調(diào)整
本文URL:http://www.muchs.cn/article46/hhidhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣網(wǎng)站策劃、做網(wǎng)站、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作