oracle常用傻瓜問(wèn)題1000問(wèn)(之五)
作者: ccbzzp
大家在應(yīng)用oracle的時(shí)候可能會(huì)遇到很多看起來(lái)不難的問(wèn)題, 特別對(duì)新手來(lái)說(shuō), 今天我簡(jiǎn)單把它總結(jié)一下, 發(fā)布給大家, 希望對(duì)大家有幫助! 和大家一起探討, 共同進(jìn)步!
對(duì)oracle高手來(lái)說(shuō)是不用看的.
本講主要講的是sql語(yǔ)句的優(yōu)化方法! 主要基于oracle9i的.
174. /*+all_rows*/
表明對(duì)語(yǔ)句塊選擇基于開銷的優(yōu)化方法,并獲得最佳吞吐量,使資源消耗最小化.
例如:
select /*+all+_rows*/ emp_no,emp_nam,dat_in from bsempms where emp_no='ccbzzp';
175. /*+first_rows*/
表明對(duì)語(yǔ)句塊選擇基于開銷的優(yōu)化方法,并獲得最佳響應(yīng)時(shí)間,使資源消耗最小化.
例如:
select /*+first_rows*/ emp_no,emp_nam,dat_in from bsempms where emp_no='ccbzzp';
176. /*+choose*/
表明如果數(shù)據(jù)字典中有訪問(wèn)表的統(tǒng)計(jì)信息,將基于開銷的優(yōu)化方法,并獲得最佳的吞吐量;
表明如果數(shù)據(jù)字典中沒(méi)有訪問(wèn)表的統(tǒng)計(jì)信息,將基于規(guī)則開銷的優(yōu)化方法;
例如:
select /*+choose*/ emp_no,emp_nam,dat_in from bsempms where emp_no='ccbzzp';
177. /*+rule*/
表明對(duì)語(yǔ)句塊選擇基于規(guī)則的優(yōu)化方法.
例如:
select /*+ rule */ emp_no,emp_nam,dat_in from bsempms where emp_no='ccbzzp';
178. /*+full(table)*/
表明對(duì)表選擇全局掃描的方法.
例如:
select /*+full(a)*/ emp_no,emp_nam from bsempms a where emp_no='ccbzzp';
179. /*+rowid(table)*/
提示明確表明對(duì)指定表根據(jù)rowid進(jìn)行訪問(wèn).
例如:
select /*+rowid(bsempms)*/ * from bsempms where rowid>='aaaaaaaaaaaaaa'
and emp_no='ccbzzp';
180. /*+cluster(table)*/
提示明確表明對(duì)指定表選擇簇掃描的訪問(wèn)方法,它只對(duì)簇對(duì)象有效.
例如:
select /*+cluster */ bsempms.emp_no,dpt_no from bsempms,bsdptms
where dpt_no='tec304' and bsempms.dpt_no=bsdptms.dpt_no;
181. /*+index(table index_name)*/
表明對(duì)表選擇索引的掃描方法.
例如:
select /*+index(bsempms sex_index) use sex_index because there are fewmale bsempms */ from bsempms where sex='m';
182. /*+index_asc(table index_name)*/
表明對(duì)表選擇索引升序的掃描方法.
例如:
select /*+index_asc(bsempms pk_bsempms) */ from bsempms where dpt_no='ccbzzp';
183. /*+index_combine*/
為指定表選擇位圖訪問(wèn)路經(jīng),如果index_combine中沒(méi)有提供作為參數(shù)的索引,將選擇出位圖索引的
布爾組合方式.
例如:
select /*+index_combine(bsempms sal_bmi hiredate_bmi)*/ * from bsempms
where sal<5000000 and hiredate<sysdate;
184. /*+index_join(table index_name)*/
提示明確命令優(yōu)化器使用索引作為訪問(wèn)路徑.
例如:
select /*+index_join(bsempms sal_hmi hiredate_bmi)*/ sal,hiredate
from bsempms where sal<60000;
185. /*+index_desc(table index_name)*/
表明對(duì)表選擇索引降序的掃描方法.
例如:
select /*+index_desc(bsempms pk_bsempms) */ from bsempms where dpt_no='ccbzzp';
186. /*+index_ffs(table index_name)*/
對(duì)指定的表執(zhí)行快速全索引掃描,而不是全表掃描的辦法.
例如:
select /*+index_ffs(bsempms in_empnam)*/ * from bsempms where dpt_no='tec305';
187. /*+add_equal table index_nam1,index_nam2,...*/
提示明確進(jìn)行執(zhí)行規(guī)劃的選擇,將幾個(gè)單列索引的掃描合起來(lái).
例如:
select /*+index_ffs(bsempms in_dptno,in_empno,in_sex)*/ * from bsempms where emp_no='ccbzzp' and dpt_no='tdc306';
188. /*+use_concat*/
對(duì)查詢中的where后面的or條件進(jìn)行轉(zhuǎn)換為union all的組合查詢.
例如:
select /*+use_concat*/ * from bsempms where dpt_no='tdc506' and sex='m';
189. /*+no_expand*/
對(duì)于where后面的or 或者in-list的查詢語(yǔ)句,no_expand將阻止其基于優(yōu)化器對(duì)其進(jìn)行擴(kuò)展.
例如:
select /*+no_expand*/ * from bsempms where dpt_no='tdc506' and sex='m';
190. /*+nowrite*/
禁止對(duì)查詢塊的查詢重寫操作.
191. /*+rewrite*/
可以將視圖作為參數(shù).
192. /*+merge(table)*/
能夠?qū)σ晥D的各個(gè)查詢進(jìn)行相應(yīng)的合并.
例如:
select /*+merge(v) */ a.emp_no,a.emp_nam,b.dpt_no from bsempms a (selet dpt_no
,avg(sal) as avg_sal from bsempms b group by dpt_no) v where a.dpt_no=v.dpt_no
and a.sal>v.avg_sal;
193. /*+no_merge(table)*/
對(duì)于有可合并的視圖不再合并.
例如:
select /*+no_merge(v) */ a.emp_no,a.emp_nam,b.dpt_no from bsempms a (selet dpt_no
,avg(sal) as avg_sal from bsempms b group by dpt_no) v where a.dpt_no=v.dpt_no
and a.sal>v.avg_sal;
194. /*+ordered*/
根據(jù)表出現(xiàn)在from中的順序,ordered使oracle依此順序?qū)ζ溥B接.
例如:
select /*+ordered*/ a.col1,b.col2,c.col3 from table1 a,table2 b,table3 c
where a.col1=b.col1 and b.col1=c.col1;
195. /*+use_nl(table)*/
將指定表與嵌套的連接的行源進(jìn)行連接,并把指定表作為內(nèi)部表.
例如:
select /*+ordered use_nl(bsempms)*/ bsdptms.dpt_no,bsempms.emp_no,bsempms.emp_nam from bsempms,bsdptms where bsempms.dpt_no=bsdptms.dpt_no;
196. /*+use_merge(table)*/
將指定的表與其他行源通過(guò)合并排序連接方式連接起來(lái).
例如:
select /*+use_merge(bsempms,bsdptms)*/ * from bsempms,bsdptms where
bsempms.dpt_no=bsdptms.dpt_no;
197. /*+use_hash(table)*/
將指定的表與其他行源通過(guò)哈希連接方式連接起來(lái).
例如:
select /*+use_hash(bsempms,bsdptms)*/ * from bsempms,bsdptms where
bsempms.dpt_no=bsdptms.dpt_no;
198. /*+driving_site(table)*/
強(qiáng)制與oracle所選擇的位置不同的表進(jìn)行查詢執(zhí)行.
例如:
select /*+driving_site(dept)*/ * from bsempms,[email protected] where bsempms.dpt_no=dept.dpt_no;
199. /*+leading(table)*/
將指定的表作為連接次序中的首表.
200. /*+cache(table)*/
當(dāng)進(jìn)行全表掃描時(shí),cache提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表lru的最近使用端
例如:
select /*+full(bsempms) cahe(bsempms) */ emp_nam from bsempms;
201. /*+nocache(table)*/
當(dāng)進(jìn)行全表掃描時(shí),cache提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表lru的最近使用端
例如:
select /*+full(bsempms) nocahe(bsempms) */ emp_nam from bsempms;
202. /*+append*/
直接插入到表的最后,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;
203. /*+noappend*/
通過(guò)在插入語(yǔ)句生存期內(nèi)停止并行模式來(lái)啟動(dòng)常規(guī)插入.
insert /*+noappend*/ into test1 select * from test4 ;
待續(xù)...