SAP中的數據庫表索引

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

本文連接:http://www.javashuo.com/article/p-rimcalnr-dz.html sql

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

主索引

主索引是由主鍵的key字段構造的惟一索引,AS ABAP總會自動建立它。對於每一個索引字段的組合,表中最多隻能有一條記錄。 若是沒法使用主索引識別記錄集,好比說,沒有使用主索引查詢字段,就會發生全表掃描,可能致使查詢性能不佳,或者數據庫系統會嘗試使用合適的二級索引(若是有的話)。緩存

二級索引

除了由主鍵定義的主索引,也能夠爲數據庫表定義惟一或不惟一的二級索引。建立二級索引一般會提升數據庫的讀性能,前提是讀取的時候使用到了二級索引。nosql

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

數據庫表在數據庫中被建立的時候,二級索引也會被定義。此外,能夠晚些在相同的系統中建立新的二級索引。若是若是在其餘系統增長新的二級索引而不做修改的話,它們會被建立爲擴展索引。如下是建議的索引的命名空間:性能

  • 客戶爲標準表添加的索引ID前綴爲'Y'或者'Z'。
  • 合做夥伴爲標準表添加的索引ID前綴爲'J',不一樣合做夥伴建立的索引的名稱可能衝突。
  • 其餘表能夠有任意名字的索引,不過不該以'Y','Z'或'J'開頭。

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

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

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

  • 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)中使用附加項%_HINTSdatabase 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索引入門簡述

相關文章
相關標籤/搜索