SQL--資料庫效能優化詳解
出處:
1.資料庫訪問優化法則
要正確的優化SQL,我們需要快速定位能性的瓶頸點,也就是說快速找到我們SQL主要的開銷在哪裡?而大多數情況效能最慢的裝置會是瓶頸點,如下載時網路速度可能會是瓶頸點,本地複製檔案時硬碟可能會是瓶頸點,為什麼這些一般的工作我們能快速確認瓶頸點呢,因為我們對這些慢速裝置的效能資料有一些基本的認識,如網路頻寬是2Mbps,硬碟是每分鐘7200轉等等。因此,為了快速找到SQL的效能瓶頸點,我們也需要了解我們計算機系統的硬體基本效能指標,下圖展示的當前主流計算機效能指標資料。
從圖上可以看到基本上每種裝置都有兩個指標:
延時(響應時間):表示硬體的突發處理能力;
頻寬(吞吐量):代表硬體持續處理能力。
從上圖可以看出,計算機系統硬體效能從高到代依次為:
CPU——Cache(L1-L2-L3)——記憶體——SSD硬碟——網路——硬碟
由於SSD硬碟還處於快速發展階段,所以本文的內容不涉及SSD相關應用系統。
根據資料庫知識,我們可以列出每種硬體主要的工作內容:
CPU及記憶體:快取資料訪問、比較、排序、事務檢測、SQL解析、函式或邏輯運算;
網路:結果資料傳輸、SQL請求、遠端資料庫訪問(dblink);
硬碟:資料訪問、資料寫入、日誌記錄、大資料量排序、大表連線。
根據當前計算機硬體的基本效能指標及其在資料庫中主要操作內容,可以整理出如下圖所示的效能基本優化法則:
這個優化法則歸納為5個層次:
1、 減少資料訪問(減少磁碟訪問)
2、 返回更少資料(減少網路傳輸或磁碟訪問)
3、 減少互動次數(減少網路傳輸)
4、 減少伺服器CPU開銷(減少CPU及記憶體開銷)
5、 利用更多資源(增加資源)
由於每一層優化法則都是解決其對應硬體的效能問題,所以帶來的效能提升比例也不一樣。傳統資料庫系統設計是也是儘可能對低速裝置提供優化方法,因此針對低速裝置問題的可優化手段也更多,優化成本也更低。我們任何一個SQL的效能優化都應該按這個規則由上到下來診斷問題並提出解決方案,而不應該首先想到的是增加資源解決問題。
以下是每個優化法則層級對應優化效果及成本經驗參考:
優化法則 | 效能提升效果 | 優化成本 |
減少資料訪問 | 1~1000 | 低 |
返回更少資料 | 1~100 | 低 |
減少互動次數 | 1~20 | 低 |
減少伺服器CPU開銷 | 1~5 | 低 |
利用更多資源 | @~10 | 高 |
接下來,我們針對5種優化法則列舉常用的優化手段並結合例項分析。
資料塊是資料庫中資料在磁碟中儲存的最小單位,也是一次IO訪問的最小單位,一個數據塊通常可以儲存多條記錄,資料塊大小是DBA在建立資料庫或表空間時指定,可指定為2K、4K、8K、16K或32K位元組。下圖是一個Oracle資料庫典型的物理結構,一個數據庫可以包括多個數據檔案,一個數據檔案內又包含多個數據塊;
ROWID
ROWID是每條記錄在資料庫中的唯一標識,通過ROWID可以直接定位記錄到對應的檔案號及資料塊位置。ROWID內容包括檔案號、對像號、資料塊號、記錄槽號,如下圖所示:
三、資料庫訪問優化法則詳解
1、減少資料訪問
1.1、建立並使用正確的索引
資料庫索引的原理非常簡單,但在複雜的表中真正能正確使用索引的人很少,即使是專業的DBA也不一定能完全做到最優。
索引會大大增加表記錄的DML(INSERT,UPDATE,DELETE)開銷,正確的索引可以讓效能提升100,1000倍以上,不合理的索引也可能會讓效能下降100倍,因此在一個表中建立什麼樣的索引需要平衡各種業務需求。
索引常見問題:
索引有哪些種類?
常見的索引有B-TREE索引、點陣圖索引、全文索引,點陣圖索引一般用於資料倉庫應用,全文索引由於使用較少,這裡不深入介紹。B-TREE索引包括很多擴充套件型別,如組合索引、反向索引、函式索引等等,以下是B-TREE索引的簡單介紹:
B-TREE索引也稱為平衡樹索引(Balance Tree),它是一種按欄位排好序的樹形目錄結構,主要用於提升查詢效能和唯一約束支援。B-TREE索引的內容包括根節點、分支節點、葉子節點。
葉子節點內容:索引欄位內容+表記錄ROWID
根節點,分支節點內容:當一個數據塊中不能放下所有索引欄位資料時,就會形成樹形的根節點或分支節點,根節點與分支節點儲存了索引樹的順序及各層級間的引用關係。
一個普通的BTREE索引結構示意圖如下所示:
如果我們把一個表的內容認為是一本字典,那索引就相當於字典的目錄,如下圖所示:
圖中是一個字典按部首+筆劃數的目錄,相當於給字典建了一個按部首+筆劃的組合索引。
一個表中可以建多個索引,就如一本字典可以建多個目錄一樣(按拼音、筆劃、部首等等)。
一個索引也可以由多個欄位組成,稱為組合索引,如上圖就是一個按部首+筆劃的組合目錄。
SQL什麼條件會使用索引?
當欄位上建有索引時,通常以下情況會使用索引:
INDEX_COLUMN = ?
INDEX_COLUMN > ?
INDEX_COLUMN >= ?
INDEX_COLUMN < ?
INDEX_COLUMN <= ?
INDEX_COLUMN between ? and ?
INDEX_COLUMN in (?,?,...,?)
INDEX_COLUMN like ?||'%'(後導模糊查詢)
T1. INDEX_COLUMN=T2. COLUMN1(兩個表通過索引欄位關聯)
SQL什麼條件不會使用索引?
查詢條件 | 不能使用索引原因 |
INDEX_COLUMN <> ? INDEX_COLUMN not in (?,?,...,?) | 不等於操作不能使用索引 |
function(INDEX_COLUMN) = ? INDEX_COLUMN + 1 = ? INDEX_COLUMN || 'a' = ? | 經過普通運算或函式運算後的索引欄位不能使用索引 |
INDEX_COLUMN like '%'||? INDEX_COLUMN like '%'||?||'%' | 含前導模糊查詢的Like語法不能使用索引 |
相關推薦no |