首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 獲取當前用戶下所有表行數:DBMS_STATS 與 USER_TABLES 實戰

     編輯:Oracle 資料庫相關知識

核心思路

Oracle 不實時維護表行數,USER_TABLES.NUM_ROWS 依賴統計信息。需先收集統計信息,再查詢視圖。

標準流程

-- 1. 收集當前 Schema 統計信息(推薦 COMPUTE 完整計算,大表可用 ESTIMATE)
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(
    ownname => USER,
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,  -- 11g+ 自動採樣
    method_opt => 'FOR ALL COLUMNS SIZE AUTO',
    cascade => TRUE,          -- 同步收集索引統計
    degree => DBMS_STATS.AUTO_DEGREE  -- 自動並行
  );
END;
/

-- 2. 查詢所有表行數
SELECT table_name,
       num_rows,
       blocks,
       empty_blocks,
       avg_row_len,
       last_analyzed
FROM user_tables
ORDER BY num_rows DESC NULLS LAST;

關鍵參數說明

參數建議值說明
estimate_percentDBMS_STATS.AUTO_SAMPLE_SIZE11g+ 自動決定最優採樣率,兼顧精度與速度
method_opt'FOR ALL COLUMNS SIZE AUTO'自動決定直方圖收集
cascadeTRUE同時收集索引統計
degreeDBMS_STATS.AUTO_DEGREE自動並行度,利用多 CPU
granularity'AUTO'分區表自動收集全局/分區級統計

進階場景

僅收集指定表

EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'BIG_TABLE', ESTIMATE_PERCENT => 10);

分區表收集分區級統計

EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'PART_TABLE', GRANULARITY => 'PARTITION');

導出/鎖定/解鎖統計信息

-- 導出統計信息到統計表
EXEC DBMS_STATS.CREATE_STAT_TABLE(USER, 'STAT_TAB');
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS(USER, 'STAT_TAB');

-- 鎖定統計信息(防止自動任務覆蓋)
EXEC DBMS_STATS.LOCK_SCHEMA_STATS(USER);

-- 解鎖
EXEC DBMS_STATS.UNLOCK_SCHEMA_STATS(USER);

獲取精確行數(不依賴統計信息)

-- 動態 SQL 生成 COUNT(*) 查詢
SET SERVEROUTPUT ON
DECLARE
  v_sql VARCHAR2(4000);
  v_cnt NUMBER;
BEGIN
  FOR t IN (SELECT table_name FROM user_tables) LOOP
    v_sql := 'SELECT COUNT(*) FROM ' || t.table_name;
    EXECUTE IMMEDIATE v_sql INTO v_cnt;
    DBMS_OUTPUT.PUT_LINE(t.table_name || ': ' || v_cnt);
  END LOOP;
END;
/
-- 注意:大表 COUNT(*) 會全表掃描,生產環境謹慎使用

常見問題排查

現象原因解決
NUM_ROWS 為 NULL從未收集統計信息執行 GATHER_SCHEMA_STATS
NUM_ROWS 與實際差異大統計信息過舊/採樣率低重新收集,大表用 AUTO_SAMPLE_SIZE
收集統計極慢大表全掃描/並行度未啟用設置 DEGREE、ESTIMATE_PERCENT、NO_INVALIDATE=FALSE
分區表全局行數不準未收集 GLOBAL 級統計GRANULARITY => 'GLOBAL AND PARTITION'

自動化維護

Oracle 11g+ 默認開啟自動統計信息收集任務(AUTO_STATS_ADVISOR_TASK),維護窗口每晚運行。可通過 DBA_AUTOTASK_CLIENT 查看狀態。大多數場景無需手工干預,僅在以下情況手工觸發:

  • 大批量數據載入後
  • 表結構變更(增減列/分區)後
  • 執行計劃異常懷疑統計信息失真
  • 新建索引後

總結

收集統計 → 查 USER_TABLES 是獲取表行數的標準路徑。生產環境依賴自動任務,關鍵操作後手工補收。NUM_ROWS 為估算值(除非 COMPUTE),精確計數需 COUNT(*) 但代價高。建議建立「統計信息健康度」監控儀表板,關注 LAST_ANALYZED、STALE_STATS、直方圖覆蓋率等指標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved