改進資料庫效能-SQL查詢優化
首先、這個部分主要是針對oracle11g(管理藝術)相關章節做的筆記,方便自己有一個系統全面的理論指導。
調優的方法論:
- 正確設計應用程式
- 調優應用程式的SQL程式碼
- 優化記憶體
- 優化IO
- 優化爭用和其他的問題
oracle11g增強了主動調優proactive tuning,被動的效能優化reactive performance tuning
優化SQL的查詢處理:
首先需要了解SQL處理的過程和優化要點
SQL語句經歷了語句分析parsing、優化optimizing、和執行executing階段,如果是查詢語句,資料要能夠被檢索,那麼在SQL處理之前還有一個額外的獲取(fetch)階段
語法分析:
主要有語法和語義,分解成關係代數查詢,檢查過程中參照資料字典(快取和基表)
優化:
使用優化程式CBO來選擇最好的訪問方法來查詢所涉及的表和索引的檢索資料,分為查詢重寫階段和物理執行計劃生成
執行計劃生成階段:
- 查詢執行的操作
- 操作執行的次序
- 執行每個操作的演算法
- 從磁碟或者記憶體檢索資料的最好方式
- 查詢期間從一個操作向另一個操作傳送資料的最好方式
生成幾個有效的物理查詢計劃,然後對他們進行成本估算,選擇估算值最低的執行計劃。
執行階段:select-直接返回查詢結果:insert update delete語句記錄被修改
最重要的就是查詢優化處理階段---它決定了快速檢索資料所涉及的所有重要問題。
統計資料:
oracle11g一般每天晚上10-早上6點以及週末的全天開啟。gather_stats_job作業,可以禁用
gather_stats_job為所有沒有優化程式統計資料,對一個物件,如果修改了10%的資料-就統計,可以通過DBA_TAB_MODIFICATIONS檢視相關更改資訊
DBA_tables—last_analyzed 提示的上次統計的時間,sample_size取樣(表大小和取樣百分比沒有關係),沒有變化的資料就不會做統計分析
必要的統計資料:
- 錶行數
- 每個資料塊的行數
- 行的平均長度
- 表的總塊數
- 每個索引的級別數
- 每個索引葉塊的數目
- 表中每一個列的不同資料值的數目
- 資料分佈柱狀圖
- 索引建的數目
- 基數
- 每個列的最大和最小值
OPTIMIZER_MODE引數
all_rows,這個是預設的,以實現最大吞吐量
first_row_n:實現響應時間
first_row:使用探測法(經驗規則)無論是否有統計資料,響應時間最小。
優化程式做什麼:
1、SQL轉換
常用的轉換:
- 將IN轉換or語句
- 將or轉換為union或者union all
- 將非直接相關的巢狀的選擇語句轉換為更有效的連線(jion)
- 將外聯結轉換為更有效的內連結(inner jion)
- 將複雜的子查詢轉換為聯結、半聯結或者反聯結(antijoin)
- 將基於星型模式的資料倉儲進行星型轉換
- 將between轉換為大於等於或者小於等於語句
2、選擇訪問路徑
- 全表掃描
- 通過rowid對錶進行訪問
- 索引掃描
3、選擇聯結方法
- 巢狀迴圈聯結 nested-loop join(驅動表每行資料都要讀取內部表的所有行)
- 雜湊聯結 hash join
- 分類合併聯結 sort-merge join
4、選擇聯結次序
聯結方式消除最大數目的行資料
CBO缺點:
- 版本不穩定帶來計劃不穩定,使用stored outline
- 有時候不是最好的,可以瞭解應用的人強制hint
- 依賴統計資料
收集統計資料:
DBMS_stats
必須手工收集統計資料:
- 外部表
- 需要收集系統統計資料
- 大型作業之後
可以收集資料庫、表、索引、使用者模式
gather_database_statistics
gather_schema_statistics
gather_table_statistics
gather_index_statistics
estimate_percent--統計的百分比,如果是null就是全部
method_opt執行是否收集直方圖
granularity :all 所有表的子分割槽、分割槽
cascade=yes就是所有的索引統計資料
option
gather為所有的物件搜尋統計資訊
gather_auto只對那些ORACLE人為必要的物件收集
gather_empty為沒有收集過的收集統計資訊
gather_stale只對那些過期的收集
收集系統統計資料
DBMS_STATS.GATHER_SYSTEM_STATS
包括IO 和CPU(無負荷模式和負荷模式)
收集資料字典統計資料
DBMS_STATS.gather_database_stats 中gather_sys=yes
DBMS_STATS.gather_dictionary_stats
動態取樣optimizer_dynamic_sampling在表中不存在統計資料或者資訊過舊的時候,讓ORACLE即時估算優化程式統計資料。
高效SQL
- 使用函式索引
- 使用右聯結
- 使用case
- 執行高效的子查詢
- 使用where代替having
- 最小化表查詢
聯結方法:
- 避免笛卡爾聯結
- 巢狀迴圈
- 雜湊聯結
- 合併聯結
索引:
對什麼進行索引
- 對高選擇行進行索引
- 對重要的外來鍵
- 對所有的謂詞
- 表聯結的列
B樹索引
點陣圖索引
IOT索引組織表
反向索引
函式索引
組合索引
使用繫結變數
避免全表掃描
DBA:
分割槽表
壓縮技術
物化檢視
使用儲存大綱保證穩定性
SQL計劃管理SPM
SQL baseline
並行執行
效能分析工具
explain plan
utlxplan.sql--建立分析表
utlxpls.sql格式化
autotrace
- utlxplan.sql--建立分析表
- plustrce.sql授權
SQLTRACE+tkprof
第三方工具
端對端跟蹤
DBMS_MONITOR
需要三個屬性:
客戶端標示符
服務名稱
模組名稱 服務名稱以及活動名稱的組合
利用觸發器鋪貨客戶端連線到DB的sessionID
結果快取記憶體
客戶端快取記憶體
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/500314/viewspace-1163643/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 優化SQL Server資料庫查詢方法優化SQLServer資料庫
- 資料庫查詢優化資料庫優化
- Laravel Passport OAuth 資料庫查詢改快取優化LaravelPassportOAuth資料庫快取優化
- SQLServer效能優化之 nolock,大幅提升資料庫查詢效能SQLServer優化資料庫
- 資料庫查詢優化:巢狀查詢資料庫優化巢狀
- 【資料庫】MySQL查詢優化資料庫MySql優化
- SQL Server資料庫查詢優化的方法總結SQLServer資料庫優化
- 【資料庫】查詢優化之子連線優化資料庫優化
- 資料庫效能優化之SQL語句優化資料庫優化SQL
- 最新IP資料庫 儲存優化 查詢效能優化 每秒解析上千萬資料庫優化
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- SQL Server資料庫查詢速度慢原因及優化方法SQLServer資料庫優化
- 資料庫全表查詢之-分頁查詢優化資料庫優化
- SQL查詢優化SQL優化
- EntityFramework優化:查詢效能Framework優化
- 資料庫查詢優化:使用explain分析sql語句執行效率資料庫優化AISQL
- 資料庫優化 - SQL優化資料庫優化SQL
- 【效能優化】ORACLE資料庫效能優化概述優化Oracle資料庫
- 優化sql查詢速度優化SQL
- 資料庫效能優化資料庫優化
- 優化SQL查詢:如何寫出高效能SQL語句優化SQL
- 優化SQL Server 2008的查詢效能優化SQLServer
- 資料庫優化SQL資料庫優化SQL
- 效能優化之分頁查詢優化
- 全文查詢的效能優化優化
- 效能優化查詢語句優化
- SQL Server 跨資料庫查詢SQLServer資料庫
- 【資料庫】sql連表查詢資料庫SQL
- Mysql 資料庫 -------- SQL語句進階查詢 ------- 前部分MySql資料庫
- Laravel Passport OAuth 資料庫查詢改快取最佳化LaravelPassportOAuth資料庫快取
- SQL Server效能的改進得益於邏輯資料庫設計SQLServer資料庫
- SQL Server 查詢優化功能SQLServer優化
- SQL查詢優化的方法SQL優化
- 優化sql提高查詢速度優化SQL
- 資料庫效能優化2資料庫優化
- Oracle資料庫效能優化Oracle資料庫優化
- 效能為王:SQL標量子查詢的優化案例分析SQL優化
- 【效能優化】查詢繫結變數的sql語句優化變數SQL