از توانایی‌های برجسته بانک اطلاعاتی Oracle 12cr1 قابلیت جمع‌آوری اطلاعات و آمار در لحظه‌ی انجام برخی عملیات‌های حجیم بر روی جداول می‌باشد و به تبع این امر نیاز به جمع‌آوری آمار و اطلاعات به صورت جداگانه به مراتب کمرنگ می‌گردد. بدین معنا دیگر نیاز به جدول اضافه‌ای به منظور گردآوری آمار نمی‌باشد و احتمال عدم جمع‌آوری اطلاعات مورد نیاز پس از انجام عملیات‌های حجیم داده‌ای بر روی بانک اطلاعاتی را در صورت فراموشی به طور عمده کاهش می‌دهد.
CREATE TABLE … AS SELECT )CTAS)
همانطور که در ذیل مشاهده می‌نمایید، بانک اطلاعاتی Oracle توانایی جمع‌آوری اطلاعات و آمار برای اکثر جداول حجیم در لحظه انجام عملیات CREATE TABLE … AS SELECT (CTAS) را دارا می‌باشد.

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>
INSERT INTO … SELECT
قابل توجه است که جمع‌آوری لحظه‌ای آمار و اطلاعات از عملیات INSERT INTO … SELECT بر روی سگمنت‌های خالی‌ که از روش آدرس‌دهی مستقیم استفاده می‌نماید نیز می‌تواند به عنوان یکی از مزایای این ویژگی جالب توجه باشد. این تغییرات در حالت اجرای parallel یا در صورتی که مؤلفه‌ی APPEND مشخص شده باشد، از شیوه آدرس‌دهی مستقیم استفاده می‌نمایند.
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
>
به منظور انجام عملیات، object مورد نظر باید حداقل یک سگمنت خالی (به دلیل احتمال از دست دادن سگمنت به علت تأخیر در ایجاد سگمنت جدید) دارا باشد. لازم به ذکر است object پس از اجرای عمل متداول DELETE به فرم صحیح باقی گذاشته نمی‌شود لذا امکان دست‌یابی به قابلیت جمع‌آوری اطلاعات و آمار لحظه‌ای در این شرایط مهیا نمی‌باشد.

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>

همچنین می‌توان از مؤلفه‌ی NO_GATHER_OPTIMIZER_STATISTICS به منظور ممانعت از اجرای عملیات جمع‌آوری اطلاعات و آمار لحظه‌ای استفاده نمود.


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>
Partitioned Tables
بارگذاری حجیم داده‌ها در یک جدول پارتیشن شده متعقباً عملیات جمع‌آوری کلی آمار را نیز فعال خواهد نمود، البته گفتنی است این اطلاعات جمع‌آوری شده شامل آمار و اطلاعات در سطح پارتیشن نمی‌باشد.

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 500
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>

نتایج آماری در عملیات بارگذاری حجیم داده‌ها که به یک پارتیشن خالی معطوف شده است، بدون هیچگونه داده‌ی آماری global کاملاً در سطح پارتیشن خواهد بود.

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>
محدودیت‌ها
جمع‌آوری اطلاعات و آمار لحظه‌ای در حین عمل بارگذاری حجیم داده در بانک اطلاعاتی محدودیت‌هایی در خصوص موارد ذیل دارد:
• اطلاعات و آمارهای ایندکس و هیستوگرام‌ها. در صورت لازم دانستن این اطلاعات بالاجبار باید در یک عملیات جداگانه جمع‌آوری گردند. فراخوان زیر آمارهای از دست داده شده را بازیابی خواهد نمود، اما به بازآوری اطلاعات و آمار نمی‌پردازد مگر در وضعیتی که اطلاعات و آمار موجود از آن جدول یا ستون ارزش آماری خود را از دست داده باشد.

EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, ‘TAB1′, options => ‘GATHER AUTO’);

• سگمنت‌های غیر خالی، به گونه‌ای که تشریح گردید.
• جداول واقع در اسکیماهای built-in. (صرفاً در جداول مربوط به اسکیماهای user-defined قابلیت اجرایی شدن دارد)
• جداول تودرتو، ایندکس شده و جداول خارجی.
• global table های موقتی که از عبارت ON COMMIT DELETE ROWS استفاده می‌نمایند.
• جداول با ستون‌های مجازی.
• اگر پارامتر PUBLISH جدول در DBMS_STATS برابر مقدار FALSE تنظیم شده باشد.
• جداولی که قابلیت آمارگیری آنان غیر فعال گردیده است.
• جداول پارتیشن شده‌ای که از آمار صعودی بهره می‌برند، در صورت عدم اشاره مستقیم عملیات درج داده‌ها به پارتیشنی که از عبارت PARTITION استفاده می‌کند.
• جداولی که به صورت multitable بارگذاری می‌شوند.

* منبع 0