-- 일반 프리스캇 씨피유에서 10분정도 걸림.
spool c:result.txt
drop table "SCOTT"."TEST2" ;
drop sequence "SCOTT"."TEST2VAL" ;
CREATE TABLE "SCOTT"."TEST2" ("ID" NUMBER(10) NOT NULL, "DATA"
    VARCHAR2(30) NOT NULL,
    "VAL1" number(2) NOT NULL,
    "VAL2" number(2) NOT NULL,
    CONSTRAINT "PK_TEST2" PRIMARY KEY("ID"))     TABLESPACE "EXAMPLE"  ;

CREATE SEQUENCE "SCOTT"."TEST2VAL" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;

CREATE INDEX "SCOTT"."TEST2VAL1"
    ON "SCOTT"."TEST2"  ("VAL1");

CREATE BITMAP
    INDEX "SCOTT"."TEST2VAL2"
    ON "SCOTT"."TEST2"  ("VAL2");


CREATE  OR  REPLACE  PROCEDURE test2insert
 (
 su number,gap number
)
as
 tmp varchar2(10);
begin
    tmp := 'testval';
    for i in 1..su loop
       insert into scott.test2
            values(
  test2val.nextval,
  'ABCDEFGHIJKLMNOPQRSTUVWXYZ!!!!',mod(test2val.currval,gap),mod(test2val.currval,gap));
    end loop;
    commit;
end;
/

 

CREATE  OR  REPLACE  PROCEDURE duB(
  su number
  )
 as
  v_count number;
  v_startTime timestamp;
  v_endTime timestamp;
  v_diff        number(11,6);
  v_toFindNumberT   number;
  v_toFindNumberB   number;
  v_avg          number(11,6) default 0;
begin
  select MAX(val1)+1 into v_toFindNumberT
 from scott.test2;
  select MAX(val2)+1 into v_toFindNumberB
 from scott.test2;


  DBMS_RANDOM.INITIALIZE(to_number(to_char(systimestamp,'ff')));
  --------------------------------------------------------------
  v_avg:=0;
  for i in 1..su loop
  v_startTime := systimestamp;
  -- 질의 시작
   select count(*) into v_count
  from scott.test2
   where val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB)
     or val2=mod(abs(dbms_random.random),v_toFindNumberB);
     -- 질의끝
   v_endTime := systimestamp;
   v_diff :=      to_number(to_char(v_endTime ,'sssss.ff')) -  to_number(to_char(v_startTime ,'sssss.ff'));
   v_avg:=v_avg+v_diff;
   DBMS_OUTPUT.PUT_LINE(i||'번째 비트맵 인텍스 : '||v_diff);
  end loop;
   DBMS_OUTPUT.PUT_LINE('  -평균시간 : '|| v_avg/su);
--------------------------------------------------------------
  v_avg:=0;
  for i in 1..su loop
  v_startTime := systimestamp;
  -- 질의 시작
   select count(*) into v_count
  from scott.test2
  where val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT)
     or val1=mod(abs(dbms_random.random),v_toFindNumberT);
   -- 질의끝
   v_endTime := systimestamp;
   v_diff := to_number(to_char(v_endTime ,'sssss.ff')) -  to_number(to_char(v_startTime ,'sssss.ff'));
   v_avg:=v_avg+v_diff;
   DBMS_OUTPUT.PUT_LINE(i||'번째 B트리 인텍스 : '||v_diff);
  end loop;
  DBMS_OUTPUT.PUT_LINE('  -평균시간 : '|| v_avg/su);
 
 -----------------------------------------------------------
  DBMS_RANDOM.TERMINATE;
end;
/

 

CREATE  OR  REPLACE  PROCEDURE duT(
  su number
  )
 as
  v_count number;
  v_startTime timestamp;
  v_endTime timestamp;
  v_diff        number(11,6);
  v_toFindNumberT   number;
  v_toFindNumberB   number;
  v_avg          number(11,6) default 0;
begin
  select MAX(val1)+1 into v_toFindNumberT
 from scott.test2;
  select MAX(val2)+1 into v_toFindNumberB
 from scott.test2;


  DBMS_RANDOM.INITIALIZE(to_number(to_char(systimestamp,'ff')));
  --------------------------------------------------------------
  v_avg:=0;
  for i in 1..su loop
  v_startTime := systimestamp;
  -- 질의 시작
   select count(*) into v_count
  from scott.test2
   where val2=mod(abs(dbms_random.random),v_toFindNumberB);
     -- 질의끝
   v_endTime := systimestamp;
   v_diff :=      to_number(to_char(v_endTime ,'sssss.ff')) -  to_number(to_char(v_startTime ,'sssss.ff'));
   v_avg:=v_avg+v_diff;
   DBMS_OUTPUT.PUT_LINE(i||'번째 비트맵 인텍스 : '||v_diff);
  end loop;
   DBMS_OUTPUT.PUT_LINE('  -평균시간 : '|| v_avg/su);
--------------------------------------------------------------
  v_avg:=0;
  for i in 1..su loop
  v_startTime := systimestamp;
  -- 질의 시작
   select count(*) into v_count
  from scott.test2
  where val1=mod(abs(dbms_random.random),v_toFindNumberT) ;
   -- 질의끝
   v_endTime := systimestamp;
   v_diff := to_number(to_char(v_endTime ,'sssss.ff')) -  to_number(to_char(v_startTime ,'sssss.ff'));
   v_avg:=v_avg+v_diff;
   DBMS_OUTPUT.PUT_LINE(i||'번째 B트리 인텍스 : '||v_diff);
  end loop;
  DBMS_OUTPUT.PUT_LINE('  -평균시간 : '|| v_avg/su);
 
 -----------------------------------------------------------
  DBMS_RANDOM.TERMINATE;
end;
/

 

set  serveroutput on

--64가지 값으로 테스트---------------------------------------
SELECT '64가지 값으로 테스트' from dual;
exec test2insert(10000,64)
exec duT(9)
exec duB(9)

--32가지 값으로 테스트---------------------------------------
drop table "SCOTT"."TEST2" ;
drop sequence "SCOTT"."TEST2VAL" ;
CREATE TABLE "SCOTT"."TEST2" ("ID" NUMBER(10) NOT NULL, "DATA"
    VARCHAR2(30) NOT NULL,
    "VAL1" number(2) NOT NULL,
    "VAL2" number(2) NOT NULL,
    CONSTRAINT "PK_TEST2" PRIMARY KEY("ID"))     TABLESPACE "EXAMPLE"  ;

CREATE SEQUENCE "SCOTT"."TEST2VAL" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;

CREATE INDEX "SCOTT"."TEST2VAL1"
    ON "SCOTT"."TEST2"  ("VAL1");

CREATE BITMAP
    INDEX "SCOTT"."TEST2VAL2"
    ON "SCOTT"."TEST2"("VAL2");


SELECT '32가지 값으로 테스트' from dual;
exec test2insert(10000,32)
exec duT(9)
exec duB(9)

--16가지 값으로 테스트---------------------------------------
drop table "SCOTT"."TEST2" ;
drop sequence "SCOTT"."TEST2VAL" ;
CREATE TABLE "SCOTT"."TEST2" ("ID" NUMBER(10) NOT NULL, "DATA"
    VARCHAR2(30) NOT NULL,
    "VAL1" number(2) NOT NULL,
    "VAL2" number(2) NOT NULL,
    CONSTRAINT "PK_TEST2" PRIMARY KEY("ID"))     TABLESPACE "EXAMPLE"  ;

CREATE SEQUENCE "SCOTT"."TEST2VAL" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;

CREATE INDEX "SCOTT"."TEST2VAL1"
    ON "SCOTT"."TEST2"  ("VAL1");

CREATE BITMAP
    INDEX "SCOTT"."TEST2VAL2"
    ON "SCOTT"."TEST2"("VAL2");

SELECT '16가지 값으로 테스트' from dual;
exec test2insert(10000,16)
exec duT(9)
exec duB(9)

 

--8가지 값으로 테스트---------------------------------------
drop table "SCOTT"."TEST2" ;
drop sequence "SCOTT"."TEST2VAL" ;
CREATE TABLE "SCOTT"."TEST2" ("ID" NUMBER(10) NOT NULL, "DATA"
    VARCHAR2(30) NOT NULL,
    "VAL1" number(2) NOT NULL,
    "VAL2" number(2) NOT NULL,
    CONSTRAINT "PK_TEST2" PRIMARY KEY("ID"))     TABLESPACE "EXAMPLE"  ;

CREATE SEQUENCE "SCOTT"."TEST2VAL" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;

CREATE INDEX "SCOTT"."TEST2VAL1"
    ON "SCOTT"."TEST2"  ("VAL1");

CREATE BITMAP
    INDEX "SCOTT"."TEST2VAL2"
    ON "SCOTT"."TEST2"("VAL2");

SELECT '8가지 값으로 테스트' from dual;
exec test2insert(10000,8)
exec duT(9)
exec duB(9)

 


--4가지 값으로 테스트---------------------------------------
drop table "SCOTT"."TEST2" ;
drop sequence "SCOTT"."TEST2VAL" ;

CREATE TABLE "SCOTT"."TEST2" ("ID" NUMBER(10) NOT NULL, "DATA"
    VARCHAR2(30) NOT NULL,
    "VAL1" number(2) NOT NULL,
    "VAL2" number(2) NOT NULL,
    CONSTRAINT "PK_TEST2" PRIMARY KEY("ID"))     TABLESPACE "EXAMPLE"  ;

CREATE SEQUENCE "SCOTT"."TEST2VAL" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER;

CREATE INDEX "SCOTT"."TEST2VAL1"
    ON "SCOTT"."TEST2"  ("VAL1");

CREATE BITMAP
    INDEX "SCOTT"."TEST2VAL2"
    ON "SCOTT"."TEST2"("VAL2");

SELECT '4가지 값으로 테스트' from dual;
exec test2insert(10000,4)
exec duT(9)
exec duB(9)

SELECT '-- 인덱스가 차지하는 크기도 비교할것..!!' from dual;

spool off