1. 程式人生 > 其它 >【與達夢同行】淺談DM統計資訊及統計資訊的匯入匯出

【與達夢同行】淺談DM統計資訊及統計資訊的匯入匯出

前言:
資料庫技術有很多,談到資料庫的核心技術,我覺得優化器尤為重要。在CBO時代,我們已經不用再關注驅動表的問題,動態取樣也已經漸漸退出舞臺,影響優化器代價的統計資訊變得十分重要。

一、什麼是統計資訊?
簡單來說,統計資訊記錄了資料庫中表及索引的分佈情況,並根據資料分佈特徵生成頻率直方圖或者等高直方圖。

二、統計資訊是如何影響CBO的呢?
影響CBO的因素有很多,在我看來,資料訪問路徑佔了其中的90%以上,其餘的為CPU及作業系統核心引數。統計資訊記錄了selectivity、聚簇因子、表的行數等資訊,它讓CBO理解資料,並以最好的路徑進行訪問。

三、統計資訊為什麼需要匯入匯出?
在資料量比較大的專案中,收集統計資訊的時間有時候比資料遷移的時間還要長,這是很常見的情況。而停機時間要求都比較嚴格,這種情況下,我們就可以提前匯出統計資訊,並在完成資料遷移之後進行匯入,節約時間。
四、統計資訊的檢視

--dba_tables可以看到表的統計資訊
SELECT SAMPLE_SIZE,LAST_ANALYZED FROM DBA_TABLES WHERE table_name = 'T1';
--sysstats(直方圖)結合表ID和物件ID可以看到表或者列和索引的統計資訊
select * from sysobjects where name = 'T1'; --1495
select * from sysstats where id='1495';

五、統計資訊收集(使用了dbms_stats包,參考DM8系統包使用手冊)

--收集TEST模式下所有物件的統計資訊,包括索引
DBMS_STATS.GATHER_SCHEMA_STATS('TEST',100,FALSE,'FOR ALL COLUMNS SIZE AUTO');
--收集T1表上所有物件資訊,包括索引
DBMS_STATS.GATHER_TABLE_STATS ('TEST', 'T1',NULL,100,FALSE,'FOR ALL COLUMNS SIZE AUTO');

六、統計資訊備份及匯入

--建立統計資訊存放表 
call dbms_stats.CREATE_STAT_TABLE('TEST', 'TEST_STAT');

--檢視統計資訊存放表
SELECT * FROM STAT$_TEST_STAT;

--匯出統計資訊
call dbms_stats.EXPORT_TABLE_STATS('TEST', 'T1', null, 'TEST_STAT', '1', TRUE);
--再次檢視統計資訊存放表
SELECT * FROM STAT$_TEST_STAT;

--使用達夢資料庫dexp/dimp工具或者dts工具進行統計資訊表存放表的匯入匯出或者遷移(這裡選擇dexp/dimp)
--dexp匯出
./dexp userid=TEST/123456789:5236 file=/data/stat.dmp log=/data/stat.log tables='STAT$_TEST_STAT'

--dimp匯入新環境
./dimp userid=TEST/123456789:5236 file=/data/stat.dmp log=/data/stat.log tables='STAT$_TEST_STAT'

--新環境匯入統計資訊
call dbms_stats.import_table_stats('TEST', 'T1', null, 'TEST_STAT', '1', TRUE);

七、使用plsql塊進行匯出匯入(實際環境中通常不是一張表,使用plsql塊更加方便,可以批量匯出一個模式下的所有表)

--匯出
begin
        for i in
        (
                select a.owner, a.table_name from all_tables a where a.owner='TEST'
        )
        loop
                call dbms_stats.export_table_stats(rs.owner, rs.table_name, null, 'TEST_STAT', '1', TRUE);
        END LOOP;
END;
--統計資訊存放表的匯入匯出參考上一步
--匯入
begin
        for i in
        (
                select a.owner, a.table_name from all_tables a where a.owner='TEST'
        )
        loop
                call dbms_stats.import_table_stats(rs.owner, rs.table_name, null, 'TEST_STAT', '1', TRUE);
        END LOOP;
END;

結語
統計資訊讓CBO更好的理解資料,讓CBO產生好的訪問路徑,而統計資訊匯入匯出對於節約時間,減少停機視窗,不失為一種好的方法。