-- 寤烘祴璇曡〃
create table test (
hm0 number(8) not null, -- 鍙風爜璧?br />
hm1 number(8) not null -- 鍙風爜姝?br />
);
-- 鎻掑叆2涓囨潯鏁版嵁
begin
for i in 1..20000 loop
insert into test values(i*100, i*100+10); -- hm0闂撮殧100錛屾瘡孌?0涓彿鐮侊紝鏁呬笉浼氫氦鍙?br />
end loop;
end;
/
commit;
-- 寤虹儲寮?br />
create index i_test_1 on test(hm0, hm1);
銆愪綆鏁堟ā寮忋?br />
-- 鏌ユ壘鍙風爜 2000006 鏄惁鍦ㄥ彿鐮佹鍒楄〃涓?br />
select * from test a
where a.hm0 <= 2000006 and a.hm1>= 2000006
;
HM0 HM1
---------- ----------
2000000 2000010
-- 娉ㄦ剰鏌ヨ璁″垝涓殑 Search columns=1; 浣庢晥鐨勫師鍥犲湪浜嶰racle浼氬垽鏂?hm0 <= 2000006 鐨勬瘡鏉¤褰曟槸鍚︽弧瓚沖叏閮╳here鏉′歡
SELECT STATEMENT, GOAL = CHOOSE
INDEX RANGE SCAN Object owner=SCOTT Object name=I_TEST_1 Search columns=1
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
54 consistent gets -- 璁板綍鏁板澶氭椂錛岃鍊間細鍔犲ぇ
銆愰噸鏋勬柟妗堛?br />
-- 鍓嶆彁錛?br />
-- 1. 闇鍦?hm0 涓婂緩涓 desc 绱㈠紩
-- 2. 鍒╃敤 rownum<... 鐗規?璁㎡racle鎵懼埌絎竴鏉¤褰曞嵆鍋滄鎵弿
create index i_test_2 on test(hm0 desc);
-- 鍒╃敤琛ㄦ湰韜涔夊喅瀹氱殑鍙風爜孌典笉浼氫氦鍙夌殑鐗規э紝榪欎簺Oracle浼樺寲鍣ㄦ槸涓嶄細鐭ラ亾鐨? index hint浼間箮涓嶈兘灝?鍚﹀垯Oracle涓嶄細鑷姩璧拌繖涓儲寮?br />
select * from(
select /*+ index(a i_test_2) */ * from test a
where a.hm0 <= 2000006
order by a.hm0 desc) b
where rownum<2 and b.hm1 >= 2000006;
HM0 HM1
---------- ----------
2000000 2000010
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=26)
1 0 COUNT (STOPKEY)
2 1 VIEW (Cost=3 Card=1 Bytes=26)
3 2 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=3 Card=1
Bytes=26)
4 3 INDEX (RANGE SCAN) OF 'I_TEST_2' (NON-UNIQUE) (Cost=
2 Card=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
-- 緇撴潫嫻嬭瘯鍒犺〃
drop table test;
perl5鍘熷垱@20110430