日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

索引规范

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 索引规范 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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字段滿足了建索引的第一個條件:
select count(distinct deptno)/count(deptno) av_count from pol_main;


  • 2. 考慮字段值的實際分布律:
    • 公式:某值的實際分布律=
    • 參數說明:
      :(actual value count)某個值對應的總記錄數;
      :(total row count)該表的總記錄數;
    • 公式說明:一般來說,通過一個字段的篩選條件,如果我們篩選出來的記錄數小于等于總記錄數的10%,我們認為此時使用索引會提高查詢效率。
    • 要求:該字段中每一個distinct值的實際分布律都小于等于10%的時候,我們允許在該字段上創建索引。只要有1個值的實際分布律大于10%,我們需要用第3部繼續進行判斷。
    • 舉例:還是以pol_main表的deptno字段為例,如果下面的查詢語句結果V_COUNT等于0,我們認為deptno字段可創建索引,否則需要用第3部進行判斷:
with t_c as --總記錄數 ?(select count(deptno) total_count from pol_main), a_r as --每個distinct值的實際分布率 ?(select count(deptno) / t_c.total_count actual_ratefrom pol_main, t_cgroup by deptno, t_c.total_count), --是否存在實際分布律>10%的值 ?select count(1) v_count from a_r where a_r.actual_rate > 0.1


  • 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數據字典,計算每個綁定變量的執行次數,采樣時間區間越長,結果越準。采樣語句如下:
select value_string, count(*) as value_executionsfrom V$SQL_BIND_CAPTUREwhere hash_value = '&hash_value' ? ? ? ? ? ? ? ? and child_address = '&child_address' ? ? ? ? ? ? ? ? and name in (&bind_value_name); 最終將采樣區間內的value_executions加和即可得出每個值的
      • III. 某一條語句的采樣數據計算完后,再從v$sql中獲取采樣時間段內的語句總執行次數,語句如下:
select sum(executions) as total_executions, ? from v$sqlwhere last_active_time >= to_date('&start_time', 'YYYYMMDD') ? ?and last_active_time <= to_date('&end_time', 'YYYYMMDD') ? ?and hash_value = '&hash_value' ? ?and child_address = '&child_address'; 查詢得到的total_executions即為該條語句的
      • 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索引
B-Tree索引是最常見的索引結構,默認建立的索引就是這種類型的索引。B-Tree索引在檢索區分度高的數據列時提供了最好的性能。當取出的行數占總行數比例較小時,B-Tree索引比全表檢索提供了效率更高的方法。當檢查的范圍超過表數據量的10%時就不能提高取回數據的性能。如果查詢結果集需要返回表的大部分數據,可能全表掃描會更有效,注意這里僅僅是可能。
create index ix_b_tree on test_tab(a) ; ? ? ?--單字段索引 create index ix_b_tree on test_tab(a,b) ; ? ? --多字段索引
  • 2)位圖索引
位圖索引主要用于決策支持系統或靜態數據,不支持行級鎖定。位圖索引最好用于低區分度列(即列的唯一值除以行數為一個很小的值,接近零),例如有一個“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬條記錄,那么3/3000000約等于0,這種情況下最適合用位圖索引。需要注意在用位圖索引的時候會帶來全表鎖。
create bitmap index ix_bitmap on test_tab(a) ; ?--單字段位圖索引 create bitmap index ix_b_tree on test_tab(a,b) ; --多字段位圖索引
  • 3)反向索引
反向索引是B-Tree索引的一個分支,它的目的就是為了降低在并行服務器環境下索引葉塊的爭用。當B-Tree索引中有一列是由遞增的序列號產生的話,那么這些索引信息基本上分布在同一個葉塊,當用戶修改或訪問相似的列時,索引塊很容易產生爭用。而反向索引中的索引碼將會被分布到各個索引塊中,減少了爭用。但需要注意在反向索引上用range scan的時候可能帶來性能下降。
create index ix_desc on test_tab(a) reverse ; ?--單字段反向索引 create index ix_desc on test_tab(a,b) reverse ; --多字段反向索引
  • 4)函數索引
與B-Tree索引不同,基于函數的索引不是存儲字段值和rowid,而是存儲函數處理過的字段值和rowid,即對索引字段進行函數處理后的結果存儲到索引中。所以如果where條件子句中經常對列名使用了相同函數的查詢,就應該將函數操作該字段的值設置為函數索引,這樣就可以通過函數索引訪問表的數據。這里特別注意:創建函數索引,需要QUERY REWRITE的權限。
create index ix_func on test_tab(function(a)) ; ?--單字段函數索引 create index ix_func on test_tab(function(a,b)) ; --多字段函數索引
  • 5)降序索引
B-Tree的衍生產物,應用于有降序排列的查詢語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。
create index ix_desc on test_tab(a desc) ; ? ? ?--單字段降序索引 create index ix_desc on test_tab(a desc,b asc) ; --多字段降序升序混合索引
  • 6)分區索引
相關內容可以參見《數據庫開發管理規范-PARTITION》。

轉載于:https://my.oschina.net/u/729507/blog/88720

總結

以上是生活随笔為你收集整理的索引规范的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。