全部產品
Search
文件中心

Tablestore:二級索引計量計費

更新時間:Jan 10, 2024

二級索引包括全域二級索引和本地二級索引。使用二級索引功能將產生額外的資料存放區量。當向資料表寫入資料時,在建立索引的過程中將產生一定的讀寫CU。本文介紹二級索引費用組成及計費方式。

說明 CU(Capacity Unit)指讀服務能力單元和寫服務能力單元,是資料讀寫操作的最小計費單位。每秒1次4 KB單行讀操作為1個預留讀CU。

使用二級索引功能後,由於索引表的存在將產生額外的資料存放區量。當向資料表中寫入資料時,在建立索引的過程中將產生一定的讀寫CU。

索引表相關的計量包括三部分:索引表構建時的讀寫CU計量、索引表資料存放區量計量、索引表讀取資料計量。

計費項目說明
資料存放區資料表以及索引表的資料存放區費用。
構建索引表的讀CU為了支援索引行的計算(舊行刪除、新行寫入、原始行更新)而進行的必要讀操作所產生的CU。
構建索引表的寫CU向索引表中寫入索引行所產生的CU。
正常讀CU通過讀介面對資料表或者索引表進行讀取產生的CU。
正常寫CU通過寫介面對資料表進行寫入所產生的CU。

索引的儲存,計算及讀取的規則為:

  • 儲存及讀取計算規則都與資料表相同。更多資訊,請參見Table Store計量計費
  • 索引表構建時的計量:
    • 只有產生了有效索引行才會產生寫CU。
    • 只要可能產生舊索引行的刪除、舊索引行的更新、新索引行的寫入,均會產生與索引列大小之和相當的讀CU。

索引表構建時的讀CU計量

資料表建立二級索引時,會產生一定量的讀CU,具體規則如下:

  • 當通過PUT操作寫入一行新的資料,並且此行資料以前不存在時(非覆蓋寫情境):
    • 如果資料表的非主鍵列上建有索引,但是此行資料不包含索引列(即此行不會產生索引行),則只產生一個讀CU。
    • 如果此行資料所在的列建有索引,並且可以根據此行資料建立有效索引(即此行會產生索引行),則產生一個讀CU。
  • 當通過PUT操作寫入一行新的資料,並且此行資料以前存在時(覆蓋寫情境):
    • 如果資料表的非主鍵列上建有索引,但此行資料舊值的非主鍵列不包含索引列,則只產生一個讀CU。
    • 如果此行資料舊值所在的列建有索引,產生的讀CU如下:

      該行舊值中,除主鍵外所有與索引表主鍵相關列的大小之和,按4 KB向上取整。如果為0,按1 CU計算。

  • 當通過UPDATE操作更新一行資料時,並且此行資料以前不存在(非更新情境):
    • 如果此行資料不涉及任何與索引表相關的列,則不產生讀CU。
    • 如果此行資料涉及與索引表相關的列,則產生一個讀CU。
  • 當通過UPDATE操作更新一行資料時,並且此行資料以前存在(更新情境):
    • 如果此次更新涉及到的所有屬性列與任何索引表都無關,則不產生讀CU。
    • 如果此次更新涉及到的所有屬性列中存在部分列作為索引表的主鍵或者屬性列,產生的讀CU如下:

      該行舊值中,除主鍵外,所有與索引表主鍵相關列的大小之和,按4 KB向上取整。如果為0,則按1 CU計算。

  • 當通過DELETE操作刪除資料表中一行資料時,產生的讀CU如下:

    該行除主鍵外,所有與索引表主鍵相關列的大小之和按4 KB向上取整。如果為0,則按1 CU計算。

  • 對於主鍵自增的資料表,新寫入資料時不產生讀CU。修改一行通過主鍵自增寫入的資料時會產生讀CU,計算規則請參見上述UPDATE更新操作 。
    說明 通過主鍵列自增功能寫入資料可以大大減少由於索引表而產生的讀CU。

    對於非主鍵列自增的表,只要發生了與索引相關列的讀取,即使未讀到資料,仍會產生1個讀CU。但對於主鍵列自增的表,新寫入資料時不會發生索引相關列的讀取,不產生讀CU。

索引表構建時的寫CU計量

在為寫入主表中的資料建立索引時,會產生一定量的寫CU。計量原則如下:

  • 如果對資料表寫入一行資料後,索引表的資料沒有發生變化,則不產生寫CU。
  • 如果對資料表寫入一行資料後,索引表增加了一行,則產生與增加的索引行大小相當的寫CU。
  • 如果對資料表寫入一行資料後,索引表刪除了一行,則產生與刪除的索引行大小相當的寫CU。
  • 如果對資料表寫入一行資料後,索引表更新了一行,則產生與更新的索引行屬性列大小相當的寫CU。
  • 如果對資料表寫入一行資料後,索引表刪除了一行並又增加了一行,則產生與刪除的索引行和增加的索引行之和大小相當的寫CU。

具體細則如下:

  • 當通過PUT操作寫入一行新的資料,並且此行資料以前不存在(非覆蓋寫情境):
    • 如果資料表的非主鍵列上建有索引,但是此行資料不涉及索引列(即此行不會產生索引行),則不產生寫CU。
    • 如果此行資料所在的列建有索引,並且可以根據此行資料建立有效索引(即此行會產生索引行),則每張索引表產生的寫CU如下:

      如果產生了有效索引行,索引表寫CU的個數計量與資料表相同,按4 KB向上取整,否則不產生寫CU。

  • 當通過PUT操作寫入一行新的資料,並且此行資料以前存在時(覆蓋寫情境):
    • 如果資料表的非主鍵列上建有索引,但是此行資料舊值的非主鍵列不涉及索引列,則不產生寫CU。
    • 如果此行資料舊值的主鍵或者屬性列上建有索引,則每張索引表產生的寫CU如下:

      對於該次PUT操作影響到的所有索引(稀疏索引可能不受影響),均計算相應的寫CU。

  • 當通過UPDATE操作更新一行資料,並且此行資料以前不存在(非更新情境):
    • 如果此行資料不涉及任何索引表相關的列,則不產生寫CU。
    • 如果此行資料涉及索引表相關的列,則每張索引表產生的寫CU如下:
      • 如果該行能夠產生有效索引行,則以索引行的大小除以4 KB向上取整進行寫CU計量。
      • 如果該行不能夠產生有效索引行,則不會產生索引表的寫CU。
  • 當通過UPDATE操作更新一行資料,並且此行資料以前存在(更新情境):
    • 如果此次更新涉及到的所有屬性列,都與任何索引表無關,則不產生寫CU。
    • 如果此次更新涉及到的所有屬性列中,部分列作為索引表的主鍵或者屬性列,則每張索引表產生的寫CU如下:
      • 如果該行的舊值產生了有效索引行,則按舊的索引行的主鍵大小,產生索引行的刪除CU。
      • 如果該行的新值產生新的有效索引行,則按新的索引行的主鍵大小,產生新的索引行的寫入CU。
      • 如果該行的新值沒有產生新的有效索引行,只是更新了舊的索引行的屬性列,則只產生舊的索引行的更新CU。

      計算規則均按索引行的大小除以4 KB向上取整。

  • 當通過DELETE操作刪除主表中一行資料時,產生的寫CU如下:

    對每張索引表,如果該行有相應的索引行,則該行中所有與索引表主鍵相關的列的大小之和,按4 KB向上取整,否則寫 CU為0。

  • 對於主鍵列自增的表,新寫入資料時會產生索引表的寫CU,寫CU計算規則與上述的通過PUT操作寫入一行新資料計算規則相同。修改一行通過主鍵列自增寫入的資料時,會產生寫CU,計算規則與上述的通過UPDATE操作更新一行資料計算規則相同。

索引表資料存放區量計量

索引表的資料存放區量與資料表無區別。索引表的資料量是索引表中所有行的資料量之和,所有行的資料量是所有單行資料的主鍵和屬性列資料量之和。更多資訊,請參見資料存放區量

索引表讀取計量

通過控制台、SDK或者其它途徑(例如DLA)進行索引表的讀取時,讀CU計量規則與資料表相同。

計算舉例

如下以包含兩張索引表的資料表為例介紹在不同寫入模式下CU的計算。

假設有資料表Table,其中有兩列主鍵PK0和PK1 ,另外有三列預定義列Col0、Col1、Col2。資料表上建有兩張索引表Index0和Index1。其中Index0的主鍵為Col0、PK0、PK1,有一屬性列Col2;Index1的主鍵為Col1、Col0、PK0、PK1,沒有屬性列。通過UPDATE介面更新PK0、PK1。

  • 如果該行以前不存在
    • 更新Col3列:不產生讀寫CU
    • 更新Col1列:產生1個讀CU,不產生寫CU
    • 更新 Col0、 Col1 兩列:
      • 產生1個讀CU
      • 對於Index0,產生與Col0、PK0、PK1大小之和相當的寫CU。對於Index1,產生Col0、Col1、PK0、PK1大小之和相當的寫CU。
  • 如果該行以前存在
    • 更新Col3列:不產生讀寫CU
    • 更新Col2列:
      • 產生舊的Col0列大小相當的讀CU,如果Col0列以前不存在,則按1 CU計算。
      • 對於Index0,如果Col0列以前不存在,則不產生寫CU;如果存在,則產生Col0、PK0、PK1、Col2大小之和相當的寫CU。對於Index1,則不產生寫CU。
    • 更新Col1列:
      • 產生舊的Col0列以及Col1列大小之和相當的讀CU。如果為0,則按1 CU計算。
      • 對於Index0,不產生寫CU。對於Index1,會產生舊的Col0 、新的Col1列、PK0、PK1大小之和相當的寫CU(寫入新的索引行)。如果舊的Col0列不存在,則不產生寫CU(沒有產生新的索引行)。另外如果舊的Col0列以及舊的Col1列都存在,則會產生舊的Col0、舊的Col1、PK0、PK1大小之和相當的寫CU(刪除舊的索引行)。