索引规范
2019獨角獸企業重金招聘Python工程師標準>>>
1.1 背景及目的當前公司數據庫中已經存在了大量的索引,這些索引占用了很多表空間,其中有部分索引的設計也不甚合理,對索引的操作及設計方法目前都沒有標準。為了能夠有效的利用索引,提高索引的性能,需要對索引進行規范管理。
鑒于以上原因,特建立此規范,旨在今后的開發工作中,對開發人員對索引的設計,審查,提交等一系列操作建立一個規范文本,并希望能夠照此嚴格執行,從而從根本上減少因索引的問題給系統帶來的負面影響。
1.2 適用范圍
本規范適用于開發人員、數據庫管理人員。
1.3 術語和縮略語
| 1 | 索引(index) | 索引是一個物理的數據庫結構。它依賴于表,是關于表中特定主題的信息位置關鍵字的列表,并提供了快速訪問這些信息的方法。 |
2、技術規范 #
2.1 設計要求規范#
為了提高查詢效率,可以根據不同的數據特點,為表建立適當的普通索引,如B-Tree索引/位圖索引/反向索引/函數索引/降序索引/分區索引等。具體可參看附錄C《幾種常用索引》。以下為最常用的B-Tree索引的實例:create index owner.policy_app_branch_code on owner.policy_application(branch_code);
2.1.1 一個表上的索引(主鍵索引和外鍵索引除外)不能超過5個。
將5個索引作為警告閥值。當超過5個索引的時候必須先用“3.3 索引的字段評估”進行評估,若評估結果合理,可申請例外,否則需要進行整改。
2.1.2 一個索引包含的所有字段的最大長度必須小于等于(db_block_size-192)*60%.
Oracle對于復合索引中包含的字段的長度是有限制的。如果索引中包含的字段長度太長,可能會報ORA-01450錯誤。
數據庫的db_block_size值可以用下面的sql進行查詢:
select value from v$parameter where name='db_block_size';
2.1.3 組合索引字段的順序,對于組合索引,最常用的字段放在前面,同等常用的字段,再按區分度,區分度高的放在前面。
字段是否常用可用公式:“該字段在where子句中出現次數*該字段相關的SQL語句執行次數”進行比對后確定。
公式中的兩個參數可直接從生產從v$sql數據字典中取一段時間的信息進行分析。具體獲取方式如下,查詢結果中count_in_where_clause和sum_executions可大致表示“該字段在where子句中出現次數”和“該字段相關的SQL語句執行次數”,column_frequence字段則是對該字段常用程度的一個量化值。如要取指定時間,可限制last_active_time的范圍。
select upper('&table_name') as table_name, ? ? ? ?upper('&column_name') as column_name, ? ? ? ?min(last_active_time) as earliest_active_time, ? ? ? ?max(last_active_time) as leastest_active_time, ? ? ? ?count(1) as count_in_where_clause, ? ? ? ?sum(executions) as sum_executions, ? ? ? ?count(1)* sum(executions) as column_frequencefrom v$sqlwhere instr(substr(upper(sql_text), instr(upper(sql_text), 'FROM')), ? ? ? ? ? ? ?upper('&table_name')) > 0 ? ?and instr(substr(upper(sql_text), instr(upper(sql_text), 'WHERE')), ? ? ? ? ? ? ?upper('&column_name')) > 0;
2.1.4 Rebuild索引前必須備份當前表和索引的統計信息;Rebuild索引后必須導入已備份的歷史統計信息,如果要重新收集統計信息,必須用SQL Optimizer中的Analyze Impact進行分析評估,并出具附錄A的評估報告,若評估通過,則可重新收集統計信息。
2.1.5 對于現有系統,所有的新建或修改索引都必須用Quest Sql Optimizer工具中的Analyze Impact組件進行分析評估,并出具附錄A的評估報告,且僅當評估通過后方可在生產環境實施變更。
2.2 索引的字段評估#
2.2.1 在判斷某個字段是否適合于加入索引的時候,必須按照如下步驟進行分析:
- 1 考慮字段的平均分布律:
- 公式:某字段的平均分布律=
- 參數說明:
:(distinct value count)某字段distinct值的個數;
:(total row count)該表的總記錄數; - 公式說明:在不收集直方圖的情況下,如果某個字段值的平均分布律<10%,CBO往往選擇走全表掃描,所建的索引往往無法應用。
- 要求:平均分布律必須大于等于10%。
- 舉例:我們現在要判斷pol_main表的deptno字段是否適合建索引,可以用下面的語句,如果av_count大于等于10%,我們認為deptno字段滿足了建索引的第一個條件:
- 公式:某字段的平均分布律=
- 2. 考慮字段值的實際分布律:
- 公式:某值的實際分布律=
- 參數說明:
:(actual value count)某個值對應的總記錄數;
:(total row count)該表的總記錄數; - 公式說明:一般來說,通過一個字段的篩選條件,如果我們篩選出來的記錄數小于等于總記錄數的10%,我們認為此時使用索引會提高查詢效率。
- 要求:該字段中每一個distinct值的實際分布律都小于等于10%的時候,我們允許在該字段上創建索引。只要有1個值的實際分布律大于10%,我們需要用第3部繼續進行判斷。
- 舉例:還是以pol_main表的deptno字段為例,如果下面的查詢語句結果V_COUNT等于0,我們認為deptno字段可創建索引,否則需要用第3部進行判斷:
- 公式:某值的實際分布律=
- 3. 考慮字段中不同值在SQL語句中的實際執行時間、執行次數等情況:
- 公式:
- 參數說明:
:(full scan elapse time)某一個值進行全表掃描的elapse time;
:(index scan elapse time)某一個值進行索引掃描的elapse time;
:(singer value executions)某一個值對應的執行次數;
:某一類值的執行次數求和;
:(total value executions)該字段中所有distinct值的執行次數求和。
:表示對每一個distinct值進行求和。
:表示對每一個SQL語句進行求和。 - 公式說明:
- I. 該公式用于判斷表中的某個字段是否可以創建索引。
- II. 該公式只適用于Oracle 10g及以上版本。
- III. 該公式用于滿足步驟1但不滿足步驟2的情況。
- IV. 如果該字段中的distinct值個數小于等于10,則需要將每個distinct值帶入公式進行計算。
- V. 如果該字段中的distinct值個數大于10,可將
的distinct值歸為一種類型,取中間
代入公式進行計算,此時需要注意
需要將這一類值中的每個值的執行次數求和。
- 要求:計算結果θ大于0時可以創建索引,小于等于0時不允許創建索引。
- 舉例:
- I. 從V$SQL中獲取字段相關所有sql的hash_value和child_address值。
- II. 對于某一條sql語句通過JOB每15分鐘一次采樣V$SQL_BIND_CAPTURE數據字典,計算每個綁定變量的執行次數,采樣時間區間越長,結果越準。采樣語句如下:
- 公式:
-
-
- III. 某一條語句的采樣數據計算完后,再從v$sql中獲取采樣時間段內的語句總執行次數,語句如下:
-
-
-
- IV. 對于某一條語句,記錄每一個值代入時的執行時間,走全表掃描的執行時間即為 ,走索引的執行時間即為 (此處為簡化過程,可將 的distinct值歸為一種類型,只做一次執行,取同一時間)。
- V. 對于某一條語句,將不同distinct值的結果求和即可得到
- VI. 對于每一個相關的sql語句,都進行以上II~V步驟操作,求和( )后即可算出最終的 值。
-
2.3索引各類操作的測試步驟#
2.3.1 索引各類操作的測試步驟如下:
- Rebuild索引:
-
- I. 從生產環境導出表及索引的統計信息;
- II. 在測試環境rebuild索引;
- III. 將導出的統計信息導入測試環境;
- 新建、修改索引:
- I. 從生產或備份庫導一個測試環境(并且導入統計信息);
- II. 使用SQL Optimizer的scan工具對修改或新增索引涉及到的所有相關SQL語句進行掃描后,使用SQL Optimizer的Analyze Impact建立基線;
- III. 進行索引修改或新建;
- IV. 收集索引的統計信息;
- V. 用SQL Optimizer的Analyze Impact再打一次基線,做影響分析;
- VI. 按照附錄A編寫評估報告。
附錄:#
附錄A: SQL Optimizer Analyze Impact報告樣板#
《 Lifetmr1.1.3version索引變更/新建影響分析報告 》《SQL重點分析清單》
附錄B:幾種常用索引#
《 幾種常用索引 》Oracle提供了不同種類的索引,這些索引針對了不同特點的數據。在給定條件下,使用哪種類型的索引對于一個應用程序的性能來說非常重要。一個錯誤的選擇可能會引發死鎖,并導致數據庫性能急劇下降或進程終止。而如果做出正確的選擇,則可以合理使用資源,使數據的查詢效率可以極大的提高。
- 1)B-Tree索引
create index ix_b_tree on test_tab(a) ; ? ? ?--單字段索引 create index ix_b_tree on test_tab(a,b) ; ? ? --多字段索引
- 2)位圖索引
create bitmap index ix_bitmap on test_tab(a) ; ?--單字段位圖索引 create bitmap index ix_b_tree on test_tab(a,b) ; --多字段位圖索引
- 3)反向索引
create index ix_desc on test_tab(a) reverse ; ?--單字段反向索引 create index ix_desc on test_tab(a,b) reverse ; --多字段反向索引
- 4)函數索引
create index ix_func on test_tab(function(a)) ; ?--單字段函數索引 create index ix_func on test_tab(function(a,b)) ; --多字段函數索引
- 5)降序索引
create index ix_desc on test_tab(a desc) ; ? ? ?--單字段降序索引 create index ix_desc on test_tab(a desc,b asc) ; --多字段降序升序混合索引
- 6)分區索引
轉載于:https://my.oschina.net/u/729507/blog/88720
總結
- 上一篇: windows服务器apache+PHP
- 下一篇: Jmeter(一)-精简测试脚本