The Start Section of 'Demo1': Using a procedure "crt_tab_test" of PL/SQL to dynamically create 'TEST' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test PURGE';
v_sql_2 := q'[CREATE TABLE test
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE 'ANALYZE TABLE test COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE 'ANALYZE TABLE test COMPUTE STATISTICS';
END crt_tab_test;
Procedure created.
EXECUTE crt_tab_test
Statement processed.
Using a procedure "crt_tab_test_pk" of PL/SQL to dynamically create 'TEST_PK' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test_pk
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test_pk PURGE';
v_sql_2 := q'[CREATE TABLE test_pk
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'ALTER TABLE test_pk ADD CONSTRAINT test_only_pk PRIMARY KEY (id)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_pk COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_pk COMPUTE STATISTICS';
END crt_tab_test_pk;
Procedure created.
EXECUTE crt_tab_test_pk
Statement processed.
Using a procedure "crt_tab_test_bi" of PL/SQL to dynamically create 'TEST_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test_bi PURGE';
v_sql_2 := q'[CREATE TABLE test_bi
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'CREATE BITMAP INDEX test_only_bi ON test_bi (flag)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_bi COMPUTE STATISTICS';
END crt_tab_test_bi;
Procedure created.
EXECUTE crt_tab_test_bi
Statement processed.
Using a procedure "crt_tab_test_pk_bi" of PL/SQL to dynamically create 'TEST_PK_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test_pk_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test_pk_bi PURGE';
v_sql_2 := q'[CREATE TABLE test_pk_bi
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'ALTER TABLE test_pk_bi ADD CONSTRAINT test_pk PRIMARY KEY (id)';
v_sql_4 := 'CREATE BITMAP INDEX test_bi ON test_pk_bi (flag)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_pk_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
EXECUTE IMMEDIATE 'ANALYZE TABLE test_pk_bi COMPUTE STATISTICS';
END crt_tab_test_pk_bi;
Procedure created.
EXECUTE crt_tab_test_pk_bi
Statement processed.
This Demo uses an ER Diagram, amongst which has a parent table 'cnt_method'
CREATE TABLE cnt_method (
mark VARCHAR2(4) CONSTRAINT cnt_method_pk PRIMARY KEY,
CONSTRAINT cnt_method_ck CHECK (mark IN ('*', '1', 'id', 'flag'))
)
Table created.
INSERT INTO cnt_method (mark) VALUES ('*')
1 row(s) inserted.
INSERT INTO cnt_method (mark) VALUES ('1')
1 row(s) inserted.
INSERT INTO cnt_method (mark) VALUES ('id')
1 row(s) inserted.
INSERT INTO cnt_method (mark) VALUES ('flag')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has another parent table 'tab_stru'
CREATE TABLE tab_stru (
name VARCHAR2(10) NOT NULL,
mark VARCHAR2(10) CONSTRAINT tab_stru_pk PRIMARY KEY,
CONSTRAINT tab_stru_ck_1 CHECK (name IN ('test', 'test_pk', 'test_bi', 'test_pk_bi')),
CONSTRAINT tab_stru_ck_2 CHECK (mark IN ('no_pk_bi', 'only_pk', 'only_bi', 'both_pk_bi'))
)
Table created.
INSERT INTO tab_stru (name, mark) VALUES ('test', 'no_pk_bi')
1 row(s) inserted.
INSERT INTO tab_stru (name, mark) VALUES ('test_pk', 'only_pk')
1 row(s) inserted.
INSERT INTO tab_stru (name, mark) VALUES ('test_bi', 'only_bi')
1 row(s) inserted.
INSERT INTO tab_stru (name, mark) VALUES ('test_pk_bi', 'both_pk_bi')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has a child table 'cnt_spd_time'
CREATE TABLE cnt_spd_time (
tab_num NUMBER NOT NULL,
tab_mark VARCHAR2(10) NOT NULL,
cnt_mark VARCHAR2(4) NOT NULL,
spd_time NUMBER NOT NULL,
time_unit VARCHAR2(1) DEFAULT 's',
CONSTRAINT cnt_spd_time_pk PRIMARY KEY (tab_num, tab_mark, cnt_mark),
CONSTRAINT cnt_spd_time_fk_1 FOREIGN KEY (tab_mark) REFERENCES tab_stru (mark),
CONSTRAINT cnt_spd_time_fk_2 FOREIGN KEY (cnt_mark) REFERENCES cnt_method (mark)
)
Table created.
CREATE OR REPLACE FUNCTION two_timestamp_interval (endtime IN TIMESTAMP, starttime IN TIMESTAMP)
RETURN NUMBER
AS
str VARCHAR2(50);
seconds NUMBER;
minutes NUMBER;
hours NUMBER;
days NUMBER;
BEGIN
str := TO_CHAR(endtime - starttime);
seconds := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+7));
minutes := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+4, 2));
hours := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+1, 2));
days := TO_NUMBER(SUBSTR(str, 1, INSTR(str, ' ')));
RETURN (days*24*60*60 + hours*60*60 + minutes*60 + seconds);
END two_timestamp_interval;
Function created.
CREATE OR REPLACE PROCEDURE cnt_tab_spd_time
AS
line_nums NUMBER;
start_time TIMESTAMP;
end_time TIMESTAMP;
consume_seconds NUMBER;
v_name tab_stru.name%TYPE;
v_mark_1 tab_stru.mark%TYPE;
v_mark_2 cnt_method.mark%TYPE;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
FOR cur1 IN (SELECT * FROM tab_stru ORDER BY ROWID) LOOP
FOR cur2 IN (SELECT * FROM cnt_method ORDER BY ROWID) LOOP
v_name := cur1.name;
v_mark_1 := cur1.mark;
v_mark_2 := cur2.mark;
start_time := SYSTIMESTAMP;
EXECUTE IMMEDIATE 'SELECT COUNT(' || v_mark_2 || ') FROM ' || v_name INTO line_nums;
end_time := SYSTIMESTAMP;
consume_seconds := two_timestamp_interval(end_time, start_time);
INSERT INTO cnt_spd_time (tab_num, tab_mark, cnt_mark, spd_time, time_unit) VALUES (line_nums, v_mark_1, v_mark_2, consume_seconds, DEFAULT);
COMMIT;
END LOOP;
END LOOP;
END cnt_tab_spd_time;
Procedure created.
EXECUTE cnt_tab_spd_time
Statement processed.
SELECT * FROM cnt_spd_time
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001212 | s | 10000 | no_pk_bi | 1 | .001209 | s | 10000 | no_pk_bi | id | .001598 | s | 10000 | no_pk_bi | flag | .001572 | s | 10000 | only_pk | * | .00179 | s | 10000 | only_pk | 1 | .001215 | s | 10000 | only_pk | id | .00146 | s | 10000 | only_pk | flag | .001455 | s | 10000 | only_bi | * | .001091 | s | 10000 | only_bi | 1 | .001093 | s | 10000 | only_bi | id | .001448 | s | 10000 | only_bi | flag | .001324 | s | 10000 | both_pk_bi | * | .001001 | s | 10000 | both_pk_bi | 1 | .000992 | s | 10000 | both_pk_bi | id | .001128 | s | 10000 | both_pk_bi | flag | .001235 | s |
---|
SELECT * FROM cnt_spd_time WHERE tab_mark = 'no_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001212 | s | 10000 | no_pk_bi | 1 | .001209 | s | 10000 | no_pk_bi | id | .001598 | s | 10000 | no_pk_bi | flag | .001572 | s |
---|
SELECT * FROM cnt_spd_time WHERE tab_mark = 'only_pk' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_pk | * | .00179 | s | 10000 | only_pk | 1 | .001215 | s | 10000 | only_pk | id | .00146 | s | 10000 | only_pk | flag | .001455 | s |
---|
SELECT * FROM cnt_spd_time WHERE tab_mark = 'only_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_bi | * | .001091 | s | 10000 | only_bi | 1 | .001093 | s | 10000 | only_bi | id | .001448 | s | 10000 | only_bi | flag | .001324 | s |
---|
SELECT * FROM cnt_spd_time WHERE tab_mark = 'both_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | both_pk_bi | * | .001001 | s | 10000 | both_pk_bi | 1 | .000992 | s | 10000 | both_pk_bi | id | .001128 | s | 10000 | both_pk_bi | flag | .001235 | s |
---|
SELECT * FROM cnt_spd_time WHERE cnt_mark = '*' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001212 | s | 10000 | only_pk | * | .00179 | s | 10000 | only_bi | * | .001091 | s | 10000 | both_pk_bi | * | .001001 | s |
---|
SELECT * FROM cnt_spd_time WHERE cnt_mark = '1' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | 1 | .001209 | s | 10000 | only_pk | 1 | .001215 | s | 10000 | only_bi | 1 | .001093 | s | 10000 | both_pk_bi | 1 | .000992 | s |
---|
SELECT * FROM cnt_spd_time WHERE cnt_mark = 'id' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | id | .001598 | s | 10000 | only_pk | id | .00146 | s | 10000 | only_bi | id | .001448 | s | 10000 | both_pk_bi | id | .001128 | s |
---|
The End Section of 'Demo1':
SELECT * FROM cnt_spd_time WHERE cnt_mark = 'flag' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | flag | .001572 | s | 10000 | only_pk | flag | .001455 | s | 10000 | only_bi | flag | .001324 | s | 10000 | both_pk_bi | flag | .001235 | s |
---|
The Start Section of 'Demo2': Using a procedure "crt_tab_test2" of PL/SQL to dynamically create 'TEST2' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test2
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test2 PURGE';
v_sql_2 := q'[CREATE TABLE test2
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2 COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2 COMPUTE STATISTICS';
END crt_tab_test2;
Procedure created.
EXECUTE crt_tab_test2
Statement processed.
Using a procedure "crt_tab_test2_pk" of PL/SQL to dynamically create 'TEST2_PK' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test2_pk
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test2_pk PURGE';
v_sql_2 := q'[CREATE TABLE test2_pk
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'ALTER TABLE test2_pk ADD CONSTRAINT test2_only_pk PRIMARY KEY (id)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_pk COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_pk COMPUTE STATISTICS';
END crt_tab_test2_pk;
Procedure created.
EXECUTE crt_tab_test2_pk
Statement processed.
Using a procedure "crt_tab_test2_bi" of PL/SQL to dynamically create 'TEST2_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test2_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test2_bi PURGE';
v_sql_2 := q'[CREATE TABLE test2_bi
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'CREATE BITMAP INDEX test2_only_bi ON test2_bi (flag)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_bi COMPUTE STATISTICS';
END crt_tab_test2_bi;
Procedure created.
EXECUTE crt_tab_test2_bi
Statement processed.
Using a procedure "crt_tab_test2_pk_bi" of PL/SQL to dynamically create 'TEST2_PK_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test2_pk_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test2_pk_bi PURGE';
v_sql_2 := q'[CREATE TABLE test2_pk_bi
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
AS SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE('1 to ]' || v_num || q'[')]';
v_sql_3 := 'ALTER TABLE test2_pk_bi ADD CONSTRAINT test2_pk PRIMARY KEY (id)';
v_sql_4 := 'CREATE BITMAP INDEX test2_bi ON test2_pk_bi (flag)';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_pk_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
EXECUTE IMMEDIATE 'ANALYZE TABLE test2_pk_bi COMPUTE STATISTICS';
END crt_tab_test2_pk_bi;
Procedure created.
EXECUTE crt_tab_test2_pk_bi
Statement processed.
This Demo uses an ER Diagram, amongst which has a parent table 'cnt_method_2'
CREATE TABLE cnt_method_2 (
mark VARCHAR2(4) CONSTRAINT cnt_method_2_pk PRIMARY KEY,
CONSTRAINT cnt_method_2_ck CHECK (mark IN ('*', '1', 'id', 'flag'))
)
Table created.
INSERT INTO cnt_method_2 (mark) VALUES ('*')
1 row(s) inserted.
INSERT INTO cnt_method_2 (mark) VALUES ('1')
1 row(s) inserted.
INSERT INTO cnt_method_2 (mark) VALUES ('id')
1 row(s) inserted.
INSERT INTO cnt_method_2 (mark) VALUES ('flag')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has another parent table 'tab_stru_2'
CREATE TABLE tab_stru_2 (
name VARCHAR2(12) NOT NULL,
mark VARCHAR2(10) CONSTRAINT tab_stru_2_pk PRIMARY KEY,
CONSTRAINT tab_stru_2_ck_1 CHECK (name IN ('test2', 'test2_pk', 'test2_bi', 'test2_pk_bi')),
CONSTRAINT tab_stru_2_ck_2 CHECK (mark IN ('no_pk_bi', 'only_pk', 'only_bi', 'both_pk_bi'))
)
Table created.
INSERT INTO tab_stru_2 (name, mark) VALUES ('test2', 'no_pk_bi')
1 row(s) inserted.
INSERT INTO tab_stru_2 (name, mark) VALUES ('test2_pk', 'only_pk')
1 row(s) inserted.
INSERT INTO tab_stru_2 (name, mark) VALUES ('test2_bi', 'only_bi')
1 row(s) inserted.
INSERT INTO tab_stru_2 (name, mark) VALUES ('test2_pk_bi', 'both_pk_bi')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has a child table 'cnt_spd_time_2'
CREATE TABLE cnt_spd_time_2 (
tab_num NUMBER NOT NULL,
tab_mark VARCHAR2(10) NOT NULL,
cnt_mark VARCHAR2(4) NOT NULL,
spd_time NUMBER NOT NULL,
time_unit VARCHAR2(1) DEFAULT 's',
CONSTRAINT cnt_spd_time_2_pk PRIMARY KEY (tab_num, tab_mark, cnt_mark),
CONSTRAINT cnt_spd_time_2_fk_1 FOREIGN KEY (tab_mark) REFERENCES tab_stru_2 (mark),
CONSTRAINT cnt_spd_time_2_fk_2 FOREIGN KEY (cnt_mark) REFERENCES cnt_method_2 (mark)
)
Table created.
CREATE OR REPLACE FUNCTION two_timestamp_interval (endtime IN TIMESTAMP, starttime IN TIMESTAMP)
RETURN NUMBER
AS
str VARCHAR2(50);
seconds NUMBER;
minutes NUMBER;
hours NUMBER;
days NUMBER;
BEGIN
str := TO_CHAR(endtime - starttime);
seconds := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+7));
minutes := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+4, 2));
hours := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+1, 2));
days := TO_NUMBER(SUBSTR(str, 1, INSTR(str, ' ')));
RETURN (days*24*60*60 + hours*60*60 + minutes*60 + seconds);
END two_timestamp_interval;
Function created.
CREATE OR REPLACE PROCEDURE cnt_tab_spd_time_2
AS
line_nums NUMBER;
start_time TIMESTAMP;
end_time TIMESTAMP;
consume_seconds NUMBER;
v_name tab_stru_2.name%TYPE;
v_mark_1 tab_stru_2.mark%TYPE;
v_mark_2 cnt_method_2.mark%TYPE;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
FOR cur1 IN (SELECT * FROM tab_stru_2 ORDER BY ROWID) LOOP
FOR cur2 IN (SELECT * FROM cnt_method_2 ORDER BY ROWID) LOOP
v_name := cur1.name;
v_mark_1 := cur1.mark;
v_mark_2 := cur2.mark;
start_time := SYSTIMESTAMP;
EXECUTE IMMEDIATE 'SELECT COUNT(' || v_mark_2 || ') FROM ' || v_name INTO line_nums;
end_time := SYSTIMESTAMP;
consume_seconds := two_timestamp_interval(end_time, start_time);
INSERT INTO cnt_spd_time_2 (tab_num, tab_mark, cnt_mark, spd_time, time_unit) VALUES (line_nums, v_mark_1, v_mark_2, consume_seconds, DEFAULT);
COMMIT;
END LOOP;
END LOOP;
END cnt_tab_spd_time_2;
Procedure created.
EXECUTE cnt_tab_spd_time_2
Statement processed.
SELECT * FROM cnt_spd_time_2
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001463 | s | 10000 | no_pk_bi | 1 | .00145 | s | 10000 | no_pk_bi | id | .001442 | s | 10000 | no_pk_bi | flag | .001458 | s | 10000 | only_pk | * | .00139 | s | 10000 | only_pk | 1 | .001296 | s | 10000 | only_pk | id | .001301 | s | 10000 | only_pk | flag | .001394 | s | 10000 | only_bi | * | .001031 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | only_bi | id | .001445 | s | 10000 | only_bi | flag | .00117 | s | 10000 | both_pk_bi | * | .000983 | s | 10000 | both_pk_bi | 1 | .000962 | s | 10000 | both_pk_bi | id | .001025 | s | 10000 | both_pk_bi | flag | .001322 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE tab_mark = 'no_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001463 | s | 10000 | no_pk_bi | 1 | .00145 | s | 10000 | no_pk_bi | id | .001442 | s | 10000 | no_pk_bi | flag | .001458 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE tab_mark = 'only_pk' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_pk | * | .00139 | s | 10000 | only_pk | 1 | .001296 | s | 10000 | only_pk | id | .001301 | s | 10000 | only_pk | flag | .001394 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE tab_mark = 'only_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_bi | * | .001031 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | only_bi | id | .001445 | s | 10000 | only_bi | flag | .00117 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE tab_mark = 'both_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | both_pk_bi | * | .000983 | s | 10000 | both_pk_bi | 1 | .000962 | s | 10000 | both_pk_bi | id | .001025 | s | 10000 | both_pk_bi | flag | .001322 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE cnt_mark = '*' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001463 | s | 10000 | only_pk | * | .00139 | s | 10000 | only_bi | * | .001031 | s | 10000 | both_pk_bi | * | .000983 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE cnt_mark = '1' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | 1 | .00145 | s | 10000 | only_pk | 1 | .001296 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | both_pk_bi | 1 | .000962 | s |
---|
SELECT * FROM cnt_spd_time_2 WHERE cnt_mark = 'id' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | id | .001442 | s | 10000 | only_pk | id | .001301 | s | 10000 | only_bi | id | .001445 | s | 10000 | both_pk_bi | id | .001025 | s |
---|
The End Section of 'Demo2':
SELECT * FROM cnt_spd_time_2 WHERE cnt_mark = 'flag' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | flag | .001458 | s | 10000 | only_pk | flag | .001394 | s | 10000 | only_bi | flag | .00117 | s | 10000 | both_pk_bi | flag | .001322 | s |
---|
The Start Section of 'Demo3': Using a procedure "crt_tab_test3" of PL/SQL to dynamically create 'TEST3' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test3
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test3 PURGE';
v_sql_2 := q'[CREATE TABLE test3 (
id NUMBER NOT NULL
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
]';
v_sql_3 := q'[INSERT /*+ append */ INTO test3
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3 COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3 COMPUTE STATISTICS';
END crt_tab_test3;
Procedure created.
EXECUTE crt_tab_test3
Statement processed.
Using a procedure "crt_tab_test3_pk" of PL/SQL to dynamically create 'TEST3_PK' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test3_pk
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test3_pk PURGE';
v_sql_2 := q'[CREATE TABLE test3_pk (
id NUMBER NOT NULL CONSTRAINT test3_only_pk PRIMARY KEY
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
]';
v_sql_3 := q'[INSERT /*+ append */ INTO test3_pk
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_pk COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_pk COMPUTE STATISTICS';
END crt_tab_test3_pk;
Procedure created.
EXECUTE crt_tab_test3_pk
Statement processed.
Using a procedure "crt_tab_test3_bi" of PL/SQL to dynamically create 'TEST3_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test3_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test3_bi PURGE';
v_sql_2 := q'[CREATE TABLE test3_bi (
id NUMBER NOT NULL
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
]';
v_sql_3 := 'CREATE BITMAP INDEX test3_only_bi ON test3_bi (flag)';
v_sql_4 := q'[INSERT /*+ append */ INTO test3_bi
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_bi COMPUTE STATISTICS';
END crt_tab_test3_bi;
Procedure created.
EXECUTE crt_tab_test3_bi
Statement processed.
Using a procedure "crt_tab_test3_pk_bi" of PL/SQL to dynamically create 'TEST3_PK_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test3_pk_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test3_pk_bi PURGE';
v_sql_2 := q'[CREATE TABLE test3_pk_bi (
id NUMBER NOT NULL CONSTRAINT test3_pk PRIMARY KEY
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
-- PARALLEL 10
]';
v_sql_3 := 'CREATE BITMAP INDEX test3_bi ON test3_pk_bi (flag)';
v_sql_4 := q'[INSERT /*+ append */ INTO test3_pk_bi
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_pk_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test3_pk_bi COMPUTE STATISTICS';
END crt_tab_test3_pk_bi;
Procedure created.
EXECUTE crt_tab_test3_pk_bi
Statement processed.
This Demo uses an ER Diagram, amongst which has a parent table 'cnt_method_3'
CREATE TABLE cnt_method_3 (
mark VARCHAR2(4) CONSTRAINT cnt_method_3_pk PRIMARY KEY,
CONSTRAINT cnt_method_3_ck CHECK (mark IN ('*', '1', 'id', 'flag'))
)
Table created.
INSERT INTO cnt_method_3 (mark) VALUES ('*')
1 row(s) inserted.
INSERT INTO cnt_method_3 (mark) VALUES ('1')
1 row(s) inserted.
INSERT INTO cnt_method_3 (mark) VALUES ('id')
1 row(s) inserted.
INSERT INTO cnt_method_3 (mark) VALUES ('flag')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has another parent table 'tab_stru_3'
CREATE TABLE tab_stru_3 (
name VARCHAR2(12) NOT NULL,
mark VARCHAR2(10) CONSTRAINT tab_stru_3_pk PRIMARY KEY,
CONSTRAINT tab_stru_3_ck_1 CHECK (name IN ('test3', 'test3_pk', 'test3_bi', 'test3_pk_bi')),
CONSTRAINT tab_stru_3_ck_2 CHECK (mark IN ('no_pk_bi', 'only_pk', 'only_bi', 'both_pk_bi'))
)
Table created.
INSERT INTO tab_stru_3 (name, mark) VALUES ('test3', 'no_pk_bi')
1 row(s) inserted.
INSERT INTO tab_stru_3 (name, mark) VALUES ('test3_pk', 'only_pk')
1 row(s) inserted.
INSERT INTO tab_stru_3 (name, mark) VALUES ('test3_bi', 'only_bi')
1 row(s) inserted.
INSERT INTO tab_stru_3 (name, mark) VALUES ('test3_pk_bi', 'both_pk_bi')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has a child table 'cnt_spd_time_3'
CREATE TABLE cnt_spd_time_3 (
tab_num NUMBER NOT NULL,
tab_mark VARCHAR2(10) NOT NULL,
cnt_mark VARCHAR2(4) NOT NULL,
spd_time NUMBER NOT NULL,
time_unit VARCHAR2(1) DEFAULT 's',
CONSTRAINT cnt_spd_time_3_pk PRIMARY KEY (tab_num, tab_mark, cnt_mark),
CONSTRAINT cnt_spd_time_3_fk_1 FOREIGN KEY (tab_mark) REFERENCES tab_stru_3 (mark),
CONSTRAINT cnt_spd_time_3_fk_2 FOREIGN KEY (cnt_mark) REFERENCES cnt_method_3 (mark)
)
Table created.
CREATE OR REPLACE FUNCTION two_timestamp_interval (endtime IN TIMESTAMP, starttime IN TIMESTAMP)
RETURN NUMBER
AS
str VARCHAR2(50);
seconds NUMBER;
minutes NUMBER;
hours NUMBER;
days NUMBER;
BEGIN
str := TO_CHAR(endtime - starttime);
seconds := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+7));
minutes := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+4, 2));
hours := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+1, 2));
days := TO_NUMBER(SUBSTR(str, 1, INSTR(str, ' ')));
RETURN (days*24*60*60 + hours*60*60 + minutes*60 + seconds);
END two_timestamp_interval;
Function created.
CREATE OR REPLACE PROCEDURE cnt_tab_spd_time_3
AS
line_nums NUMBER;
start_time TIMESTAMP;
end_time TIMESTAMP;
consume_seconds NUMBER;
v_name tab_stru_3.name%TYPE;
v_mark_1 tab_stru_3.mark%TYPE;
v_mark_2 cnt_method_3.mark%TYPE;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
FOR cur1 IN (SELECT * FROM tab_stru_3 ORDER BY ROWID) LOOP
FOR cur2 IN (SELECT * FROM cnt_method_3 ORDER BY ROWID) LOOP
v_name := cur1.name;
v_mark_1 := cur1.mark;
v_mark_2 := cur2.mark;
start_time := SYSTIMESTAMP;
EXECUTE IMMEDIATE 'SELECT COUNT(' || v_mark_2 || ') FROM ' || v_name INTO line_nums;
end_time := SYSTIMESTAMP;
consume_seconds := two_timestamp_interval(end_time, start_time);
INSERT INTO cnt_spd_time_3 (tab_num, tab_mark, cnt_mark, spd_time, time_unit) VALUES (line_nums, v_mark_1, v_mark_2, consume_seconds, DEFAULT);
COMMIT;
END LOOP;
END LOOP;
END cnt_tab_spd_time_3;
Procedure created.
EXECUTE cnt_tab_spd_time_3
Statement processed.
SELECT * FROM cnt_spd_time_3
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001094 | s | 10000 | no_pk_bi | 1 | .001109 | s | 10000 | no_pk_bi | id | .001008 | s | 10000 | no_pk_bi | flag | .001307 | s | 10000 | only_pk | * | .001263 | s | 10000 | only_pk | 1 | .001285 | s | 10000 | only_pk | id | .001237 | s | 10000 | only_pk | flag | .001329 | s | 10000 | only_bi | * | .001018 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | only_bi | id | .001023 | s | 10000 | only_bi | flag | .000996 | s | 10000 | both_pk_bi | * | .00097 | s | 10000 | both_pk_bi | 1 | .001036 | s | 10000 | both_pk_bi | id | .001009 | s | 10000 | both_pk_bi | flag | .001026 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE tab_mark = 'no_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001094 | s | 10000 | no_pk_bi | 1 | .001109 | s | 10000 | no_pk_bi | id | .001008 | s | 10000 | no_pk_bi | flag | .001307 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE tab_mark = 'only_pk' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_pk | * | .001263 | s | 10000 | only_pk | 1 | .001285 | s | 10000 | only_pk | id | .001237 | s | 10000 | only_pk | flag | .001329 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE tab_mark = 'only_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_bi | * | .001018 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | only_bi | id | .001023 | s | 10000 | only_bi | flag | .000996 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE tab_mark = 'both_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | both_pk_bi | * | .00097 | s | 10000 | both_pk_bi | 1 | .001036 | s | 10000 | both_pk_bi | id | .001009 | s | 10000 | both_pk_bi | flag | .001026 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE cnt_mark = '*' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001094 | s | 10000 | only_pk | * | .001263 | s | 10000 | only_bi | * | .001018 | s | 10000 | both_pk_bi | * | .00097 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE cnt_mark = '1' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | 1 | .001109 | s | 10000 | only_pk | 1 | .001285 | s | 10000 | only_bi | 1 | .000986 | s | 10000 | both_pk_bi | 1 | .001036 | s |
---|
SELECT * FROM cnt_spd_time_3 WHERE cnt_mark = 'id' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | id | .001008 | s | 10000 | only_pk | id | .001237 | s | 10000 | only_bi | id | .001023 | s | 10000 | both_pk_bi | id | .001009 | s |
---|
The End Section of 'Demo3':
SELECT * FROM cnt_spd_time_3 WHERE cnt_mark = 'flag' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | flag | .001307 | s | 10000 | only_pk | flag | .001329 | s | 10000 | only_bi | flag | .000996 | s | 10000 | both_pk_bi | flag | .001026 | s |
---|
The Start Section of 'Demo4': Using a procedure "crt_tab_test4" of PL/SQL to dynamically create 'TEST4' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test4
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test4 PURGE';
v_sql_2 := q'[CREATE TABLE test4 (
id NUMBER NOT NULL
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
]';
v_sql_3 := q'[INSERT /*+ append */ INTO test4
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4 COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4 COMPUTE STATISTICS';
END crt_tab_test4;
Procedure created.
EXECUTE crt_tab_test4
Statement processed.
Using a procedure "crt_tab_test4_pk" of PL/SQL to dynamically create 'TEST4_PK' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test4_pk
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test4_pk PURGE';
v_sql_2 := q'[CREATE TABLE test4_pk (
id NUMBER NOT NULL CONSTRAINT test4_only_pk PRIMARY KEY
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
]';
v_sql_3 := q'[INSERT /*+ append */ INTO test4_pk
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_pk COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_pk COMPUTE STATISTICS';
END crt_tab_test4_pk;
Procedure created.
EXECUTE crt_tab_test4_pk
Statement processed.
Using a procedure "crt_tab_test4_bi" of PL/SQL to dynamically create 'TEST4_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test4_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test4_bi PURGE';
v_sql_2 := q'[CREATE TABLE test4_bi (
id NUMBER NOT NULL
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
]';
v_sql_3 := 'CREATE BITMAP INDEX test4_only_bi ON test4_bi (flag)';
v_sql_4 := q'[INSERT /*+ append */ INTO test4_bi
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_bi COMPUTE STATISTICS';
END crt_tab_test4_bi;
Procedure created.
EXECUTE crt_tab_test4_bi
Statement processed.
Using a procedure "crt_tab_test4_pk_bi" of PL/SQL to dynamically create 'TEST4_PK_BI' table containing 1e4 lines data
CREATE OR REPLACE PROCEDURE crt_tab_test4_pk_bi
AS
v_num NUMBER;
v_sql_1 VARCHAR2(2000);
v_sql_2 VARCHAR2(2000);
v_sql_3 VARCHAR2(2000);
v_sql_4 VARCHAR2(2000);
BEGIN
v_num := 1e4;
v_sql_1 := 'DROP TABLE test4_pk_bi PURGE';
v_sql_2 := q'[CREATE TABLE test4_pk_bi (
id NUMBER NOT NULL CONSTRAINT test4_pk PRIMARY KEY
, flag VARCHAR2(7) NOT NULL
)
SEGMENT CREATION IMMEDIATE
NOLOGGING
PARALLEL 10
]';
v_sql_3 := 'CREATE BITMAP INDEX test4_bi ON test4_pk_bi (flag)';
v_sql_4 := q'[INSERT /*+ append */ INTO test4_pk_bi
SELECT ROWNUM id
, CASE WHEN ROWNUM BETWEEN 1 AND 1/5*]' || v_num || q'[ THEN 'low' ]'
|| q'[ WHEN ROWNUM BETWEEN 2/5*]' || v_num || q'[ AND 3/5*]' || v_num || q'[ THEN 'mid' ]'
|| q'[ WHEN ROWNUM BETWEEN 4/5*]' || v_num || q'[ AND ]' || v_num || q'[ THEN 'high' ]'
|| q'[ ELSE 'unknown'
END flag
FROM XMLTABLE ('1 to ]' || v_num || q'[')]';
EXECUTE IMMEDIATE v_sql_1;
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_pk_bi COMPUTE STATISTICS';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE v_sql_2;
EXECUTE IMMEDIATE v_sql_3;
EXECUTE IMMEDIATE v_sql_4;
COMMIT;
EXECUTE IMMEDIATE 'ANALYZE TABLE test4_pk_bi COMPUTE STATISTICS';
END crt_tab_test4_pk_bi;
Procedure created.
EXECUTE crt_tab_test4_pk_bi
Statement processed.
This Demo uses an ER Diagram, amongst which has a parent table 'cnt_method_4'
CREATE TABLE cnt_method_4 (
mark VARCHAR2(4) CONSTRAINT cnt_method_4_pk PRIMARY KEY,
CONSTRAINT cnt_method_4_ck CHECK (mark IN ('*', '1', 'id', 'flag'))
)
Table created.
INSERT INTO cnt_method_4 (mark) VALUES ('*')
1 row(s) inserted.
INSERT INTO cnt_method_4 (mark) VALUES ('1')
1 row(s) inserted.
INSERT INTO cnt_method_4 (mark) VALUES ('id')
1 row(s) inserted.
INSERT INTO cnt_method_4 (mark) VALUES ('flag')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has another parent table 'tab_stru_4'
CREATE TABLE tab_stru_4 (
name VARCHAR2(12) NOT NULL,
mark VARCHAR2(10) CONSTRAINT tab_stru_4_pk PRIMARY KEY,
CONSTRAINT tab_stru_4_ck_1 CHECK (name IN ('test4', 'test4_pk', 'test4_bi', 'test4_pk_bi')),
CONSTRAINT tab_stru_4_ck_2 CHECK (mark IN ('no_pk_bi', 'only_pk', 'only_bi', 'both_pk_bi'))
)
Table created.
INSERT INTO tab_stru_4 (name, mark) VALUES ('test4', 'no_pk_bi')
1 row(s) inserted.
INSERT INTO tab_stru_4 (name, mark) VALUES ('test4_pk', 'only_pk')
1 row(s) inserted.
INSERT INTO tab_stru_4 (name, mark) VALUES ('test4_bi', 'only_bi')
1 row(s) inserted.
INSERT INTO tab_stru_4 (name, mark) VALUES ('test4_pk_bi', 'both_pk_bi')
1 row(s) inserted.
COMMIT
Statement processed.
This Demo uses an ER Diagram, amongst which has a child table 'cnt_spd_time_4'
CREATE TABLE cnt_spd_time_4 (
tab_num NUMBER NOT NULL,
tab_mark VARCHAR2(10) NOT NULL,
cnt_mark VARCHAR2(4) NOT NULL,
spd_time NUMBER NOT NULL,
time_unit VARCHAR2(1) DEFAULT 's',
CONSTRAINT cnt_spd_time_4_pk PRIMARY KEY (tab_num, tab_mark, cnt_mark),
CONSTRAINT cnt_spd_time_4_fk_1 FOREIGN KEY (tab_mark) REFERENCES tab_stru_4 (mark),
CONSTRAINT cnt_spd_time_4_fk_2 FOREIGN KEY (cnt_mark) REFERENCES cnt_method_4 (mark)
)
Table created.
CREATE OR REPLACE FUNCTION two_timestamp_interval (endtime IN TIMESTAMP, starttime IN TIMESTAMP)
RETURN NUMBER
AS
str VARCHAR2(50);
seconds NUMBER;
minutes NUMBER;
hours NUMBER;
days NUMBER;
BEGIN
str := TO_CHAR(endtime - starttime);
seconds := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+7));
minutes := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+4, 2));
hours := TO_NUMBER(SUBSTR(str, INSTR(str, ' ')+1, 2));
days := TO_NUMBER(SUBSTR(str, 1, INSTR(str, ' ')));
RETURN (days*24*60*60 + hours*60*60 + minutes*60 + seconds);
END two_timestamp_interval;
Function created.
CREATE OR REPLACE PROCEDURE cnt_tab_spd_time_4
AS
line_nums NUMBER;
start_time TIMESTAMP;
end_time TIMESTAMP;
consume_seconds NUMBER;
v_name tab_stru_4.name%TYPE;
v_mark_1 tab_stru_4.mark%TYPE;
v_mark_2 cnt_method_4.mark%TYPE;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
FOR cur1 IN (SELECT * FROM tab_stru_4 ORDER BY ROWID) LOOP
FOR cur2 IN (SELECT * FROM cnt_method_4 ORDER BY ROWID) LOOP
v_name := cur1.name;
v_mark_1 := cur1.mark;
v_mark_2 := cur2.mark;
start_time := SYSTIMESTAMP;
EXECUTE IMMEDIATE 'SELECT COUNT(' || v_mark_2 || ') FROM ' || v_name INTO line_nums;
end_time := SYSTIMESTAMP;
consume_seconds := two_timestamp_interval(end_time, start_time);
INSERT INTO cnt_spd_time_4 (tab_num, tab_mark, cnt_mark, spd_time, time_unit) VALUES (line_nums, v_mark_1, v_mark_2, consume_seconds, DEFAULT);
COMMIT;
END LOOP;
END LOOP;
END cnt_tab_spd_time_4;
Procedure created.
EXECUTE cnt_tab_spd_time_4
Statement processed.
SELECT * FROM cnt_spd_time_4
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001391 | s | 10000 | no_pk_bi | 1 | .001428 | s | 10000 | no_pk_bi | id | .00125 | s | 10000 | no_pk_bi | flag | .001189 | s | 10000 | only_pk | * | .001339 | s | 10000 | only_pk | 1 | .001289 | s | 10000 | only_pk | id | .00122 | s | 10000 | only_pk | flag | .001235 | s | 10000 | only_bi | * | .000985 | s | 10000 | only_bi | 1 | .001039 | s | 10000 | only_bi | id | .000944 | s | 10000 | only_bi | flag | .000974 | s | 10000 | both_pk_bi | * | .000962 | s | 10000 | both_pk_bi | 1 | .001067 | s | 10000 | both_pk_bi | id | .001062 | s | 10000 | both_pk_bi | flag | .000964 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE tab_mark = 'no_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001391 | s | 10000 | no_pk_bi | 1 | .001428 | s | 10000 | no_pk_bi | id | .00125 | s | 10000 | no_pk_bi | flag | .001189 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE tab_mark = 'only_pk' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_pk | * | .001339 | s | 10000 | only_pk | 1 | .001289 | s | 10000 | only_pk | id | .00122 | s | 10000 | only_pk | flag | .001235 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE tab_mark = 'only_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | only_bi | * | .000985 | s | 10000 | only_bi | 1 | .001039 | s | 10000 | only_bi | id | .000944 | s | 10000 | only_bi | flag | .000974 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE tab_mark = 'both_pk_bi' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | both_pk_bi | * | .000962 | s | 10000 | both_pk_bi | 1 | .001067 | s | 10000 | both_pk_bi | id | .001062 | s | 10000 | both_pk_bi | flag | .000964 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE cnt_mark = '*' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | * | .001391 | s | 10000 | only_pk | * | .001339 | s | 10000 | only_bi | * | .000985 | s | 10000 | both_pk_bi | * | .000962 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE cnt_mark = '1' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | 1 | .001428 | s | 10000 | only_pk | 1 | .001289 | s | 10000 | only_bi | 1 | .001039 | s | 10000 | both_pk_bi | 1 | .001067 | s |
---|
SELECT * FROM cnt_spd_time_4 WHERE cnt_mark = 'id' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | id | .00125 | s | 10000 | only_pk | id | .00122 | s | 10000 | only_bi | id | .000944 | s | 10000 | both_pk_bi | id | .001062 | s |
---|
The End Section of 'Demo4':
SELECT * FROM cnt_spd_time_4 WHERE cnt_mark = 'flag' ORDER BY ROWID
TAB_NUM | TAB_MARK | CNT_MARK | SPD_TIME | TIME_UNIT | 10000 | no_pk_bi | flag | .001189 | s | 10000 | only_pk | flag | .001235 | s | 10000 | only_bi | flag | .000974 | s | 10000 | both_pk_bi | flag | .000964 | s |
---|