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_percent | DBMS_STATS.AUTO_SAMPLE_SIZE | 11g+ 自動決定最優採樣率,兼顧精度與速度 |
| method_opt | 'FOR ALL COLUMNS SIZE AUTO' | 自動決定直方圖收集 |
| cascade | TRUE | 同時收集索引統計 |
| degree | DBMS_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、直方圖覆蓋率等指標。