近期啟動了基於達夢數據庫的大數據量性能測試,發現創建索引后並不會自動更新對應的統計信息。
現象描述
我們在使用達夢數據庫的過程中,有時候碰到一個這樣子的情況:
Create table manyrows_tables;
Select * from manyrows_tables where col=xx; -- 查詢很慢
Create index test_1 on manyrows_tables(col);
Select * from manyrows_tables where col=xx; -- 查詢還是很慢?
處理方法
根據達夢的官方文檔資料介紹,收集統計信息一共有三種方式:
1. Sp 系統函數: SP_TAB_STAT_INIT ( 'SYSDBA' , 'TEST_TABLE' ); SP_INDEX_STAT_INIT ( 'SYSDBA' , 'IDX_TEST_COL1' );等
2. Stat 命令:Stat 100 on test(col);
3. Dbms_stats 系統包: DBMS_STATS.GATHER_TABLE_STATS('USERNAME','TABLENAME',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
但實測發現,前兩種方式都沒有生效,DBMS_STATS.GATHER_XX 執行成功后貌似還要等N分鍾后,才能真正生效,不清楚DM內部是什么操作邏輯。
根據DM文檔和網上資料看,貌似可以創建計划任務作業定時進行統計信息的更新收集。
參考資料:
http://blog.itpub.net/69949798/viewspace-2661599/
https://blog.csdn.net/weixin_42845771/article/details/104772553
DBMS_STATS包 :收集統計信息,刪除統計信息
1、table_stats_show 獲取表的統計信息。
2、column_stats_show 獲取列的統計信息,返回列的統計信息,另一個時直方圖的統計信息。
3、index_stats_show 獲取索引的統計信息。
GATHER_TABLE_STATS 收集表,表中的列,索引的統計信息
GATHER_INDEX_STATS 收集索引的統計信息。
GATHER_SCHEMA_STATS 收集模式下的對象統計信息。
DLETE_TABLE_STATS 刪除表相關的統計信息。
DELETE_INDEX_STATS 刪除索引的統計信息。
DELETE_COLUMN_STATS 刪除列的統計信息。
那些對象不支持統計信息:
1、外部表、DBLINK遠程表 、動態視圖表、臨時表。
2、所在表空間為OFFLINE的對象。
3、位圖索引、全文索引
4、數據類型:blob image clob text… 也不支持 自定義類型和空間類型也不支持。
dbms_stats.gather_schema_stats('USERNAME',100,TRUE,'FOR ALL INDEXED COLUMNS SIZE AUTO');
dbms_stats.gather_table_stats(ownname => 'USERNAME',tabname => 'TABLENAME',estimate_percent => 100 ,method_opt => 'for all columns SIZE AUTO' ,cascade => true);
dbms_stats.index_stats_show ('GSCLOUD2003' , 'IDX_FSBZDJ_BXR');
dbms_stats.column_stats_show ('GSCLOUD2003', 'FSBZDJ' , 'FSBZDJ_BXR');
dbms_stats.column_stats_show ('GSCLOUD2003', 'FSBZDJ' , 'FSBZDJ_USERID');
查看執行計划
explain for select * from t1 where id=1;