試試這個(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)題你告訴我。
使用提示(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
like?'%a%'任何情況下都不會(huì)走索引。
寫出
substr(SSPCS,1,6)?between??'500101'?and??'500234'
并且建立函數(shù)索引。
PS:網(wǎng)上有說(shuō)like?'500112%'這種能通過(guò)索引查詢。
游標(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)