GetRange操作でデータを読み取るときに、指定した範囲外の主キーを持つデータが返される場合は、セカンダリインデックスを作成して、指定した範囲内の主キーを持つデータのみを読み取ることができます。
問題の説明
GetRange 操作を呼び出してTablestoreコンソールまたはTablestore SDKを使用して範囲クエリを実行する場合、Tablestoreの外部テーブルをクエリする場合、またはTablestore Readerを使用してTablestoreからデータを同期する場合、指定した範囲外の主キーを持つデータが返されます。
考えられる原因
指定されたクエリ条件が左一致の原則に準拠していません。たとえば、データテーブルに2つの主キー列が含まれている場合、最初の主キー列にbeginPrimaryKey = INF_MIN
とendPrimaryKey = INF_MAX
を指定し、2番目の主キー列にbeginPrimaryKey = 10
とendPrimaryKey = 10
を指定すると、2番目の主キー列の値が10の行だけでなく、テーブル内のすべてのデータが返されます。
左一致の原則とは、右側の主キー列の開始主キーと終了主キーで指定された範囲は、各左端の主キー列内で開始主キーと終了主キーが同じ場合にのみ有効になることを示します。左端の主キー列の開始主キーと終了主キーが異なる場合、右側の主キー列の開始主キーと終了主キーで指定された範囲は有効になりません。ここで、左端と右側の主キーとは、テーブル構造で主キーが定義されている順序を指します。
解決策
指定された主キー列の順序でセカンダリインデックスを作成し、必要に応じて適切なクエリ方法を選択します。
Tablestoreコンソールまたは特定のSDKを使用して指定した範囲内のデータをクエリするには、セカンダリインデックスを使用します。詳細については、データのクエリとTablestore SDKを使用したセカンダリインデックスの概要をご参照ください。
Tablestore外部テーブルで指定した範囲内のデータをクエリするには、外部テーブルを作成するために実行されるSQLステートメントでテーブル名をセカンダリインデックス名に設定します。詳細については、Tablestore外部テーブルの作成をご参照ください。
Tablestore Readerを使用してTablestoreから指定した範囲内のデータを同期するには、データ同期スクリプトでテーブル名をセカンダリインデックス名に設定します。詳細については、Tablestore Readerをご参照ください。