36-Oracle Statistics Gathering(統計信息收集)

小伙伴們,有沒有因為統計信息不準,導致了業務卡頓,各種狀況頻出,這幾天在實踐和實操的過程中,時不時就需要進行統計信息的收集。同時統計信息收集的動作也是OCM必考內容。

數據庫中的數據是地圖,統計信息是導航儀,而優化器則是駕駛策略的制定者,CBO依賴統計信息做出最優成本和路徑選擇。

一、統計信息功能

在Oracle數據庫管理中,統計信息收集(Statistics Gathering)是非常非常重要的環節,直接影響著數據庫的性能優化和查詢效率。

優化查詢性能:

數據庫優化器使用統計信息來評估執行計劃的成本,選擇最優的執行路徑。可以根據列的分布、表的大小、索引的選擇性等信息來決定是全表掃描還是索引掃描。

自動調整執行計劃:

統計信息幫助數據庫自動調整執行計劃。隨著數據的變化,統計信息會更新,這可以確保數據庫持續使用最優的執行策略。避免因數據分布變化導致的執行計劃突變(Plan Flip)

提高查詢的準確性:

統計信息提供了關于數據的精確度,這對于估算查詢結果的行數非常關鍵。在執行聚合查詢(如COUNT、SUM等)時,準確的統計信息可以確保返回的結果更加準確。

改善成本估算:

數據庫優化器通過統計信息來估算各種操作的成本,如掃描行數、連接操作的開銷等。這些估算用于選擇最佳的查詢執行計劃。減少不必要的I/O和CPU消耗,降低全表掃描風險

支持分區和物化視圖:

對于使用分區表和物化視圖的數據庫設計,統計信息對于優化器的決策至關重要。分區表的選擇性統計可以幫助優化器更有效地決定使用哪個分區。

支持高級功能:

同樣支持高級功能,自動SQL調優、數據倉庫優化器這些也將依賴于準確的統計信息來提供最佳的性能。

二、收集方式

1. ?自動收集機制?
Oracle通過GATHER_STATS_JOB自動任務實現智能收集:
  • ?觸發條件?:當DBA_TAB_MODIFICATIONS中記錄的DML量 > 表行數的10%時標記為陳舊(Stale)
  • ?時間窗口?:默認工作日晚10點-早6點及周末全天
  • ?優先級策略?:先處理缺失統計信息對象,再處理陳舊度高的對象
--啟用命令BEGINDBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation   => NULL,window_name => NULL);
END; 
/
--PL/SQL procedure successfully completed.
--直接用表名和用戶名可以做粗略收集,其他按照列等選項收集,需要細化
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('用戶名');
EXEC DBMS_STATS.GATHER_TABLE_STATS('用戶名', '表名');
2. ?手動收集原則?
以下場景需手動干預:
  • ?ETL作業后?:避免優化器使用陳舊信息
  • ?數據分布傾斜?:存在極端值的列需特殊處理
  • ?性能敏感對象?:核心業務表結構變更后
  • 導出到導入必要收集統計信息

三、統計信息的要點

下面用SH Schema驗證,統計信息直接決定分區表SALES、大表CUSTOMERS的查詢效率:
  • ?優化器決策依據?統計信息為CBO提供數據分布特征。舉例:
-- 查看SALES表統計信息(關鍵字段)
SELECT num_rows, blocks, avg_row_len 
FROM dba_tables 
WHERE owner='SH' AND table_name='SALES';
--NUM_ROWS     BLOCKS AVG_ROW_LEN
---------- ---------- -----------0          0           0
若num_rows嚴重偏離實際值(如因數據遷移未更新),優化器可能錯誤選擇全表掃描而非分區裁剪。
  • ?資源消耗優化?準確的索引統計信息(如CUSTOMERS_PK的聚簇因子)可避免低效索引掃描:
SELECT clustering_factor 
FROM dba_indexes 
WHERE index_name='CUSTOMERS_PK';
--
CLUSTERING_FACTOR
-----------------00

高聚簇因子(接近表塊數)表明索引效率低,需結合統計信息調整索引策略。?

四、舉例SH Schema的統計信息收集方法

自動收集策略優化

啟用增量收集降低分區表開銷:

-- 開啟SALES表增量統計
EXEC DBMS_STATS.SET_TABLE_PREFS('SH', 'SALES', 'INCREMENTAL', 'TRUE');
--PL/SQL procedure successfully completed.
-- 驗證設置
SELECT preference_value 
FROM dba_tab_stat_prefs 
WHERE owner='SH' AND table_name='SALES' AND preference_name='INCREMENTAL';
--效果?:僅收集數據變更的分區。
PREFERENCE_VALUE
--------------------------------------------------------------------------
TRUE
設置用戶SH自動收集任務?

?

BEGINDBMS_SCHEDULER.CREATE_JOB (job_name        => 'gather_stats_job',job_type        => 'PLSQL_BLOCK',job_action      => 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(''SH''); END;',start_date      => SYSTIMESTAMP,repeat_interval => 'FREQ=DAILY; INTERVAL=1', -- 例如每天執行一次enabled         => TRUE,comments        => '自動收集統計信息');
END;
/
手動收集關鍵場景

?1. 直方圖精準控制?

對偏斜字段SALES.AMOUNT_SOLD收集等高直方圖:

BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname    => 'SH',tabname    => 'SALES',method_opt => 'FOR COLUMNS SIZE 254 AMOUNT_SOLD', -- 254桶數degree     => 4);
END;
/
--
PL/SQL procedure successfully completed.
SYS@FREE>
-- 驗證直方圖
SELECT column_name, histogram, num_buckets 
FROM dba_tab_cols 
WHERE owner='SH' AND table_name='SALES' AND column_name='AMOUNT_SOLD';
--
COLUMN_NAME    HISTOGRAM       NUM_BUCKETS
______________ ____________ ______________
AMOUNT_SOLD    NONE                      0

?判定?:若HISTOGRAM=HEIGHT BALANCED且NUM_BUCKETS>=100,則有效反映數據分布。?

?2. 分區級統計驗證?

檢測分區SALES_Q4_2001的陳舊狀態--提前確認有分區:?

SELECT partition_name, stale_stats, last_analyzed
FROM dba_tab_statistics
WHERE owner='SH' AND table_name='SALES'AND partition_name='SALES_Q4_2024'AND stale_stats='YES'; -- 陳舊狀態檢測

處理?:若返回記錄,需對該分區單獨收集:?

--提前檢測確認分區
EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','SALES',partname=>'SALES_Q4_2024');

三、可驗證監控腳本(舉例SH Schema)

準確性驗證

對比COSTS表統計行數 vs 實際行數:

WITH actual AS (SELECT /*+ DYNAMIC_SAMPLING(4) */ COUNT(*) actual_rows FROM sh.costs
)
SELECT t.num_rows "統計行數",a.actual_rows "實際行數",ROUND(ABS((t.num_rows - a.actual_rows)/NULLIF(a.actual_rows,0))*100,2) diff_pct
FROM dba_tables t, actual a
WHERE t.owner='SH' AND t.table_name='COSTS'AND ABS(t.num_rows - a.actual_rows) > 10000; -- 差異>1萬行告警no rows selected

?閾值建議?:diff_pct > 5% 時需手動刷新統計。

自動任務健康監測

檢查自動任務狀態及失敗歷史:

SELECT job_name, enabled, last_start_date,(SELECT COUNT(*) FROM dba_scheduler_job_run_details WHERE job_name='GATHER_STATS_JOB' AND status='FAILED') fail_count
FROM dba_scheduler_jobs 
WHERE job_name='GATHER_STATS_JOB'
UNION ALL
-- 檢查SH模式下統計信息鎖定
SELECT 'STATS_LOCK', NULL, NULL, COUNT(*)
FROM dba_tab_statistics 
WHERE owner='SH' AND locked='YES';
JOB_NAME      ENABLED    LAST_START_DATE       FAIL_COUNT
_____________ __________ __________________ _____________
STATS_LOCK                                           4890
? 處理邏輯?:
  • fail_count > 0 → 檢查 dba_scheduler_job_log
  • STATS_LOCK > 0 → 使用 DBMS_STATS.UNLOCK_TABLE_STATS 解鎖。

四、實操體會

在舉例SH Schema中需重點關注:
  1. ?分區表增量統計?:降低90%收集開銷,尤其對時間分區字段(如SALES.TIME_ID)。
  2. ?偏斜字段直方圖?:對金額/數量等高基數列(AMOUNT_SOLD、QUANTITY_SOLD)定制桶數。
  3. ?混合收集策略?:
  • 自動任務處理日常變更
  • ETL后對SALES/COSTS手動刷新
  • 使用?PENDING STATS 測試:
EXEC DBMS_STATS.SET_TABLE_PREFS('SH','SALES','PUBLISH','FALSE');
--
PL/SQL procedure successfully completed.

TIPS:

  • 通過統計信息收集,可精準驗證統計信息對查詢優化的實際影響,實現從理論到高效運維的閉環
  • 在進行大量數據加載或數據修改后,及時重新收集統計信息是非常重要的,以確保優化器能基于最新數據做出正確的決策。
  • 在生產環境中,建議定期監控統計信息的準確性和完整性,必要時進行手動或自動的調整和重新收集
  • 過度頻繁地收集統計信息可能會影響系統性能,因為這會增加數據庫的負載。因此,應根據實際需要平衡收集頻率和系統性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85426.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux驅動程序(PWM接口)與超聲波測距

一、利用阿里云服務器實現樹莓派外網訪問(SSH 反向代理) 1. 樹莓派端配置 步驟 1:安裝 SSH 服務(若未安裝) sudo apt-get install openssh-server 步驟 2:創建反向代理連接 -p 22:指定阿里…

Web攻防-XSS跨站文件類型功能邏輯SVGPDFSWFHTMLXMLPMessageLocalStorage

知識點: 1、Web攻防-XSS跨站-文件類型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能邏輯-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件類型觸發XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

強大模型通過自我和解進步——Unsupervised Elicitation of Language Models——論文閱讀筆記

本周關注的工作是:Unsupervised Elicitation of Language Models 這篇文章通篇體現了這樣一件事——香蕉皮大需要香蕉大! 一句話總結 首先注意:這個工作不是面向對齊的,而是寫【如何準備】對齊任務的Reward Model需要的數據集的…

Qt—(Qt初識,槽,信號,事件)

一 Qt初識 暫時不寫了 我的理解是類似于c#,是一個組件庫,不局限是一個組件框架。 二 Qt Core Qt Core 是 Qt 框架的基礎模塊,提供非 GUI 的核心功能: 核心類:QObject(信號槽機制)、QEvent&…

深度學習——基于卷積神經網絡實現食物圖像分類【2】(數據增強)

文章目錄 引言一、項目概述二、環境準備三、數據預處理3.1 數據增強與標準化3.2 數據集準備 四、自定義數據集類五、構建CNN模型六、訓練與評估6.1 訓練函數6.2 評估函數6.3 訓練流程 七、關鍵技術與優化八、常見問題與解決九、完整代碼十、總結 引言 本文將詳細介紹如何使用P…

詳細說說分布式Session的幾種實現方式

1. 基于客戶端存儲(Cookie-Based) 原理:將會話數據直接存儲在客戶端 Cookie 中 實現: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama訪問模型,為什么會出現模型胡亂輸出,然后過一會兒再訪問,就又變成正常的

例子:大模型推理遇到內存不足 1. 場景還原 你在Mac上用Ollama運行如下代碼(以Python為例,假設Ollama有API接口): import requestsprompt "請寫一首關于夏天的詩。" response requests.post("http:…

簡說 Linux 用戶組

Linux 用戶組 的核心概念、用途和管理方法,盡量簡明易懂。 🌟 什么是 Linux 用戶組? 在 Linux 系統中: 👉 用戶組(group) 是一組用戶的集合,用來方便地管理權限。 👉 用…

S32DS上進行S32K328的時鐘配置,LPUART時鐘配置步驟詳解

1:S32K328的基礎信息 S32K328官網介紹 由下圖可知,S32K328的最大主頻為 240MHz 2:S32K328時鐘樹配置 2.1 system clock node 節點說明 根據《S32K3xx Reference Manual》資料說明 Table 143 各個 系統時鐘節點 的最大頻率如下所示&#…

wordpress小語種網站模板

wordpress朝鮮語模板 紫色風格的韓語wordpress主題,適合做韓國、朝鮮的外貿公司官方網站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 綠色的日語wordpress外貿主題,用來搭建日文外貿網站很實用。 https://www.jianzhanpress.co…

網絡:Wireshark解析https協議,firefox

文章目錄 問題瀏覽器訪問的解決方法python requests問題 現在大部分的網站已經切到https,很多站點即使開了80的端口,最終還是會返回301消息,讓客戶端轉向到https的一個地址。 所以在使用wireshark進行問題分析的時候,解析tls上層的功能,是必不可少的,但是這個安全交換的…

ollama部署開源大模型

1. 技術概述 Spring AI:Spring 官方推出的 AI 框架,簡化大模型集成(如文本生成、問答系統),支持多種 LLM 提供商。Olama:開源的本地 LLM 推理引擎,支持量化模型部署,提供 REST API …

Kafka 可靠性保障:消息確認與事務機制(二)

Kafka 事務機制 1. 冪等性與事務的關系 在深入探討 Kafka 的事務機制之前,先來了解一下冪等性的概念。冪等性,簡單來說,就是對接口的多次調用所產生的結果和調用一次是一致的。在 Kafka 中,冪等性主要體現在生產者端&#xff0c…

使用 React.Children.map遍歷或修改 children

使用場景: 需要對子組件進行統一處理(如添加 key、包裹額外元素、過濾特定類型等)。 動態修改 children 的 props 或結構。 示例代碼:遍歷并修改 children import React from react;// 一個組件,給每個子項添加邊框…

智能體三階:LLM→Function Call→MCP

哈嘍,我是老劉 老劉是個客戶端開發者,目前主要是用Flutter進行開發,從Flutter 1.0開始到現在已經6年多了。 那為啥最近我對MCP和AI這么感興趣的呢? 一方面是因為作為一個在客戶端領域實戰多年的程序員,我覺得客戶端開發…

flutter的常規特征

前言 Flutter 是由 Google 開發的開源 UI 軟件開發工具包,用于構建跨平臺的高性能、美觀且一致的應用程序。 一、跨平臺開發能力 1.多平臺支持:Flutter 支持構建 iOS、Android、Web、Windows、macOS 和 Linux 應用,開發者可以使用一套代碼庫在…

【Git】代碼托管服務

博主:👍不許代碼碼上紅 歡迎:🐋點贊、收藏、關注、評論。 格言: 大鵬一日同風起,扶搖直上九萬里。 文章目錄 Git代碼托管服務概述Git核心概念主流Git托管平臺Git基礎配置倉庫創建方式Git文件狀態管理常用…

Android 網絡請求的選擇邏輯(Connectivity Modules)

代碼分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立與數據庫連接(版本問題的解決方案)踩坑總結

1.如何優雅的建立數據庫連接 今天使用這個deepseek寫代碼,主要就是建立數據庫的鏈接,包括這個建庫建表啥的都是他整得,我就是負責執行,然后解決這個里面遇到的一些問題; 其實我學習這個C#不過是短短的4天的時間&…

FastAPI的初步學習(Django用戶過來的)

我一直以來是Django重度用戶。它有清晰的MVC架構模式、多應用組織結構。它內置用戶認證、數據庫ORM、數據庫遷移、管理后臺、日志等功能,還有強大的社區支持。再搭配上Django REST framework (DRF) ,開發起來效率極高。主打功能強大、易于使用。 曾經也…