SAP中的數據庫表索引

數據庫表中的索引可以加快查詢的速度。索引是數據庫表字段的有序副本。附加的字段包含指向真實數據庫錶行的指針。排序可以使訪問錶行的速度變快,例如,可以使用二分搜索。數據庫表至少有一個主索引,由它的key字段定義。它也可以有一到多個二級索引。

本文鏈接:https://www.cnblogs.com/hhelibeb/p/11061879.html

英文原文:https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abenddic_database_tables_index.htm

主索引

主索引是由主鍵的key字段構造的唯一索引,AS ABAP總會自動創建它。對於每個索引字段的組合,表中最多只能有一條記錄。 如果無法使用主索引識別記錄集,比如說,沒有使用主索引查詢字段,就會發生全表掃描,或者數據庫系統會嘗試使用合適的二級索引(如果有的話)。

二級索引

除了由主鍵定義的主索引,也可以為數據庫表定義唯一或不唯一的二級索引。創建二級索引通常會提高數據庫的讀性能,前提是讀取的時候使用到了二級索引。

二級索引包含一系列數據庫表字段,有一個最大3位長度的文本数字組成的ID。0是一個保留ID,用來表示主索引。string和rawstring類型的字段無法成為索引字段(全文索引除外)。也不建議使用數據類型FLTP的字段作為索引字段。

數據庫表在數據庫中被創建的時候,二級索引也會被定義。此外,可以晚些在相同的系統中創建新的二級索引。如果如果在其他系統增加新的二級索引而不作修改的話,它們會被創建為擴展索引。以下是建議的索引的命名空間:

  • 客戶為標準表添加的索引ID前綴為’Y’或者’Z’。
  • 合作夥伴為標準表添加的索引ID前綴為’J’,不同合作夥伴創建的索引的名稱可能衝突。
  • 其他表可以有任意名字的索引,不過不應以’Y’,’Z’或’J’開頭。

數據庫中的索引名字通常是DBTAB~ID,DBTAB是數據庫表的名字,ID是3位字符的ID。也可能有其它名字,比如空格或下劃線。

二級索引可以是唯一的,但是(不像主索引)沒必要。對唯一索引而言,數據庫表不能含有同樣索引值的多行數據。試圖插入重複的行,會取消數據庫操作,並在ABAP中觸發相應的異常。在指定了client的表中,唯一索引必須包含client字段。

訪問數據庫時,數據庫系統的優化器會檢查是否有合適的索引,並使用它。索引的選擇取決於平台,意味着可以在ABAP字典中定義非唯一索引在不同的數據庫系統中是否可用。有幾種選項,

  • Index in all database systems:這個索引會在每個數據庫中創建。
  • In selected database systems:可以使用選擇列表或排除列表來定義數據庫系統,每個列表最多有4個條目。
  • No database index:不在任何數據庫中創建索引,這個選項可以用於刪除二級索引。

這些選項對錶緩存的二級索引無效。如果表緩存有相關設置,那麼系統就會根據表緩存的設置決定是否使用二級索引。

唯一二級索引總是會被創建,而且無法從數據庫刪除。可以使用事務代碼ST05中的SQL跟蹤功能來判斷訪問數據時系統使用的索引。

索引對於查詢數據的提升效果取決於索引代表結果數據集的能力。只有索引中可以對結果集進行有效約束的字段才是有用的。這種情況下,索引中的字段順序是一個對於數據的訪問速度十分重要的因素。第一個字段必須是那些有着大量不同可選值的字段。在查詢中,要在查詢條件中指定索引的第一個字段,這樣索引才有用。另外,只有一個索引字段前面的全部索引字段都在查詢條件內時,這個索引字段才生效。字段的訪問速度和索引是否為唯一索引無關。

對於以下情況,創建二級索引可以帶來好處:

  • 如果需要查詢的表記錄不包含在現有索引內,響應時間很久,應該創建二級索引。
  • 這個字段的選擇性很強,每個值可以用於區分少於5%的表記錄。
  • 數據庫主要用於讀取。因為更改表時也需要更新索引,會降低寫入性能。
  • 如果讀取的字段也在索引里,那麼在訪問索引后不需要再次從索引之外讀取它們。如果只有少量字段經常被選擇,把它們全部包含在索引里的做法可以大大提高性能。

注:選擇性(Selectivity),是指不重複的索引值(也叫基數,Cardinality)與表記錄數(#T)的比值, Index Selectivity = Cardinality / #T

二級索引也會增加系統負載,因為每次表內容被修改時,二級索引都要做相應調整。表的每個額外的索引都會降低插入行的性能。如果需要頻繁在表中插入數據,那麼應該只建立很少的索引。太多索引也會導致數據庫的優化器找不到正確的索引。為了避免這點,表中的索引最好不相交(沒有相同的字段)。

索引應該只包含幾個字段,比如,原則上不超過4個。這是因為索引字段在被更新的時候,索引也要被更新。適合作為索引的字段是:

  • 經常被查詢,並且選擇性高。需要把選擇性最高的字段放在索引的開始位置。
  • 如果一個字段在大部分表記錄中的值都是初始值,那麼它不應成為索引字段。
  • 如果一個數據庫表有不止一個索引,那麼索引間不應該重疊。

不應該為一個表創建超過5個索引,因為,

  • 每個索引都會增加更新開銷。
  • 數據量會增加。
  • 數據庫優化器會因為可選擇的索引過多變得更加容易出錯。

索引只支持明確的條件值,比如=或者LIKE。如果條件中包含某些不確定因素,比如<>,那麼索引將無法改善性能。條件中包含OR時,優化器通常停止工作。換句話說,使用索引時,OR條件的字段是不生效的。一個例外是OR關係互相獨立。因此,對於包含OR和索引字段結合的條件,有時需要修改條件的形式。(可以看下面的例子)

注意

  • 某些數據庫的索引會忽略0,意味着查詢0值時,沒有索引可用。
  • 如有必要,可以在ABAP SQL(Open SQL)中使用附加項%_HINTS為database hints來調整系統優化器,以決定使用哪個二級索引。

例子

下面這個句子會導致優化器無法使用索引,因為遇到了OR:

SELECT * FROM spfli 
         WHERE carrid = 'LH' AND 
              ( CITYFROM = 'FRANKFURT' OR  cityfrom = 'NEW YORK' ).

替換成下面這樣的一個相等的句子,可以根據現有索引對整個條件進行優化(原因見前文):

SELECT * 
       FROM spfli 
       WHERE ( carrid = 'LH' AND cityfrom = 'FRANKFURT' ) OR 
             ( carrid = 'LH' AND cityfrom = 'NEW YORK' ).

全文索引

SAP HANA數據庫支持全文索引,全文索引可以作為二級索引。全文索引會在數據庫中被創建為一個額外的可見的列。全文索引的列的內容會被保存在這個額外的列中,以某種格式存儲,在相關數據被訪問的時候會發揮作用。

以下是全文索引的使用條件:

  • 只有對SAP HANA數據庫中的列存儲類型的表,才可以創建全文索引。
  • 只能為數據類型為指定的幾種內建數據類型的列(CHAR, SHORTSTRING, STRING, or RAWSTRING)創建全文索引,一個全文索引只能對應一個列。
  • 數據庫表必須包含一個文本語言列。

全文索引總是非唯一索引。使用全文索引的訪問基於數據庫中的WHERE CONTAINS元素。目前這個元素在ABAP SQL中還不可用,需要使用Native SQL或者AMDP。

注意

更多有關全文索引的信息,參看:SAP HANA Developer Guide.

 

參考閱讀:MySQL索引入門簡述

 

【精選推薦文章】

自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”