Online Statistics Gathering for Bulk Loads in Oracle Database 12c Release 1 (12.1)
See how Oracle 12c can automatically gather statistics for some bulk operations.
oracle 12cconfigurationintermediate
by OracleDba
14 views
See how Oracle 12c can automatically gather statistics for some bulk operations.
12345678910111213141516171819202122
CONN test/test@pdb1
DROP TABLE tab1 PURGE;
CREATE TABLE tab1 AS
SELECT level AS id,
'Description of ' || level AS description
FROM dual
CONNECT BY level <= 1000;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
1000
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
TRUNCATE TABLE tab1;
INSERT /*+ APPEND */ INTO tab1
SELECT level AS id,
'Description of ' || level AS description
FROM dual
CONNECT BY level <= 500;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
500
SQL>
TRUNCATE TABLE tab1;
INSERT INTO tab1
SELECT level AS id,
'Description of ' || level AS description
FROM dual
CONNECT BY level <= 700;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
500
SQL>
DELETE FROM tab1;
COMMIT;
INSERT /*+ APPEND */ INTO tab1
SELECT level AS id,
'Description of ' || level AS description
FROM dual
CONNECT BY level <= 700;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
500
SQL>
TRUNCATE TABLE tab1;
INSERT /*+ APPEND */ INTO tab1
SELECT
/*+ NO_GATHER_OPTIMIZER_STATISTICS */
level AS id,
'Description of ' || level AS description
FROM dual
CONNECT BY level <= 700;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
500
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
DROP TABLE tab1 PURGE;
CREATE TABLE tab1
(id NUMBER,
created_date DATE)
PARTITION BY RANGE (created_date)
(PARTITION tab1_2015 VALUES LESS THAN (TO_DATE('01/01/2016', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION tab1_2016 VALUES LESS THAN (TO_DATE('01/01/2017', 'DD/MM/YYYY')) TABLESPACE users);
INSERT /*+ APPEND */ INTO tab1
SELECT level,
TO_DATE('01/01/2016', 'DD/MM/YYYY')
FROM dual
CONNECT BY level <= 100;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1 100
SQL>
COLUMN table_name FORMAT A20
COLUMN partition_name FORMAT A20
SELECT table_name,
partition_name,
num_rows
FROM user_tab_partitions
WHERE table_name = 'TAB1'
ORDER BY partition_name;
TABLE_NAME PARTITION_NAME NUM_ROWS
-------------------- -------------------- ----------
TAB1 TAB1_2015
TAB1 TAB1_2016
SQL>
EXEC DBMS_STATS.delete_table_stats(USER, 'TAB1');
TRUNCATE TABLE tab1;
INSERT /*+ APPEND */ INTO tab1 PARTITION (TAB1_2016)
SELECT level,
TO_DATE('01/01/2016', 'DD/MM/YYYY')
FROM dual
CONNECT BY level <= 100;
COMMIT;
COLUMN table_name FORMAT A20
SELECT table_name,
num_rows
FROM user_tables
WHERE table_name = 'TAB1';
TABLE_NAME NUM_ROWS
-------------------- ----------
TAB1
SQL>
COLUMN table_name FORMAT A20
COLUMN partition_name FORMAT A20
SELECT table_name,
partition_name,
num_rows
FROM user_tab_partitions
WHERE table_name = 'TAB1'
ORDER BY partition_name;
TABLE_NAME PARTITION_NAME NUM_ROWS
-------------------- -------------------- ----------
TAB1 TAB1_2015
TAB1 TAB1_2016 100
SQL>1
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'TAB1', options => 'GATHER AUTO');Please to add comments
No comments yet. Be the first to comment!