|
create table rptdata.t_bank_code
(bank_id varchar2(10),--bank_id
rules number(10), --range μ?3¤?è
range varchar2(15) --bank bin
);
insert into rptdata.t_bank_code
select
dbms_random.string('A',9),
null,
'3'||to_char(trunc(dbms_random.value(0,99999999)))
from dual
connect by level<=1000000;
update rptdata.t_bank_code
set rules =length(range) ;
commit;
create index rptdata.vv_idx1 on rptdata.t_bank_code(to_char(to_number(range)+1),range DESC );
CREATE TABLE RPTDATA.SAMP
AS
SELECT AA FROM (
SELECT RANGE||LPAD(DBMS_RANDOM.value(0,TO_NUMBER(LPAD('9',(15-LENGTH(RANGE)),'9'))),15-LENGTH(RANGE),'0') AA
FROM rptdata.t_bank_code vvv
ORDER BY DBMS_RANDOM.value)
WHERE ROWNUM<=10000
SELECT LPAD('m',10,'0') FROM DUAL;
--TEST
CREATE OR REPLACE PACKAGE TEST_TURN
IS
PROCEDURE P_IDX;
PROCEDURE P_FUL;
END;
/
CREATE OR REPLACE PACKAGE BODY TEST_TURN AS
procedure P_IDX IS
T_IDX RPTDATA.t_bank_code%ROWTYPE;
BEGIN
FOR AA IN (SELECT aa CARD FROM RPTDATA.SAMP WHERE ROWNUM<=100)
LOOP
SELECT * INTO T_IDX FROM (
SELECT * FROM (
SELECT /*+ index(vvv vv_idx1) */ *
FROM rptdata.t_bank_code vvv
WHERE
to_char(to_number(range)+1) >=AA.CARD AND
RANGE <=AA.CARD )
WHERE substr(AA.CARD,1,rules)=range
ORDER BY RULES DESC )
WHERE ROWNUM=1;
END LOOP;
END P_IDX;
PROCEDURE P_FUL
AS
T_FUL RPTDATA.t_bank_code%ROWTYPE;
BEGIN
FOR AA IN (SELECT aa CARD FROM RPTDATA.SAMP WHERE ROWNUM<=100)
LOOP
SELECT * INTO T_FUL FROM (
SELECT * FROM rptdata.t_bank_code vvv
WHERE substr(AA.CARD,1,rules)=range
ORDER BY RULES DESC )
WHERE ROWNUM=1;
END LOOP;
END P_FUL;
END TEST_TURN;
/
SET TIMING ON;
SET SERVEROUTPUT ON;
EXEC TEST_TURN.P_FUL;--100次75秒
EXEC TEST_TURN.P_IDX;--100次24秒
--结果完全符合要求
--方案:
create index rptdata.vv_idx1 on rptdata.t_bank_code(to_char(to_number(range)+1),range DESC );
--查询
SELECT * FROM (
SELECT * FROM (
SELECT /*+ index(vvv vv_idx1) */ *
FROM rptdata.t_bank_code vvv
WHERE
to_char(to_number(range)+1) >=AA.CARD AND
RANGE <=AA.CARD )
WHERE substr(AA.CARD,1,rules)=range
ORDER BY RULES DESC )
WHERE ROWNUM=1;
|
|