改進資料庫效能-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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫查詢優化資料庫優化
- Laravel Passport OAuth 資料庫查詢改快取優化LaravelPassportOAuth資料庫快取優化
- 【資料庫】MySQL查詢優化資料庫MySql優化
- 【資料庫】查詢優化之子連線優化資料庫優化
- 最新IP資料庫 儲存優化 查詢效能優化 每秒解析上千萬資料庫優化
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- 資料庫全表查詢之-分頁查詢優化資料庫優化
- 資料庫查詢優化:使用explain分析sql語句執行效率資料庫優化AISQL
- 資料庫優化 - SQL優化資料庫優化SQL
- 優化sql查詢速度優化SQL
- SQL Server 跨資料庫查詢SQLServer資料庫
- EntityFramework優化:查詢效能Framework優化
- 資料庫優化SQL資料庫優化SQL
- Mysql 資料庫 -------- SQL語句進階查詢 ------- 前部分MySql資料庫
- Android SQL資料庫查詢方法 query( )AndroidSQL資料庫
- Laravel Passport OAuth 資料庫查詢改快取最佳化LaravelPassportOAuth資料庫快取
- 效能優化之分頁查詢優化
- MYSQL資料庫------SQL優化MySql資料庫優化
- mysql查詢太慢,我們如何進行效能優化?MySql優化
- 資料庫效能優化2資料庫優化
- 十七、Mysql之SQL優化查詢MySql優化
- MySQL-效能優化-索引和查詢優化MySql優化索引
- 資料庫系列:MySQL慢查詢分析和效能最佳化資料庫MySql
- MySQL: 使用explain 優化查詢效能MySqlAI優化
- mysql查詢效能優化總結MySql優化
- MySQL 資料庫與 SQL 優化MySql資料庫優化
- 【資料庫】優化SQL語言資料庫優化SQL
- MySQL效能優化之簡單sql改寫MySql優化
- 千萬級資料深分頁查詢SQL效能最佳化實踐SQL
- 改進 es 搜尋模組,像查詢資料庫一樣查詢 es,附完整小案例資料庫
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫
- Golang原生sql操作Mysql資料庫增刪改查GolangMySql資料庫
- 記一次 Golang 資料庫查詢元件的優化。Golang資料庫元件優化
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- SQL Server 查詢資料庫中所有表資料條數SQLServer資料庫
- 提高mysql千萬級大資料SQL查詢優化30條經驗(Mysql索引優化注意)MySql大資料優化索引
- 關係型資料庫查詢語言 SQL 和圖資料庫查詢語言 nGQL 對比資料庫SQL
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- 記一次資料庫查詢超時優化問題資料庫優化