資料庫表中的索引可以加快查詢的速度。索引是資料庫表欄位的有序副本。附加的欄位包含指向真實資料庫錶行的指標。排序可以使訪問錶行的速度變快,例如,可以使用二分搜尋。資料庫表至少有一個主索引,由它的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索引入門簡述