すべてのプロダクト
Search
ドキュメントセンター

Tablestore:SQL 文を実行してデータをクエリするときにデータ遅延が発生した場合の対処方法

最終更新日:Feb 11, 2025

問題の説明

データテーブルに新しいデータを追加した後、またはデータテーブルのデータを更新した後、データ遅延が発生し、SQL 文を実行して最新のデータを取得できません。

考えられる原因

データテーブルに 多次元インデックス を作成すると、SQL エンジンは、 多次元インデックス にデータのクエリを実行するために実行する SQL 文に含まれるすべてのデータ列が含まれている場合、 多次元インデックス を自動的に選択してデータをクエリします。詳細については、「インデックス選択ポリシー」をご参照ください。

多次元インデックス 内のデータには同期遅延が発生する可能性があります。そのため、データがデータテーブルに書き込まれたとしても、SQL 文を実行した後に最新のデータが返されない場合があります。

解決策

  • 多次元インデックス が優先的に使用されないことを明示的に指定する

    SQL 文を実行してデータをクエリする場合は、SQL 文に use index() コマンドを含めて、 多次元インデックス が優先的に使用されないことを明示的に指定します。

    たとえば、exampletable という名前のデータテーブルに、pknamecontext のデータ列が含まれており、上記のデータ列を含む 多次元インデックス がデータテーブルに作成されているとします。 多次元インデックス が指定されていない次のサンプル SQL 文を実行して、データをクエリできます。

    SELECT pk,name,context FROM exampletable use index();  -- データテーブルからデータをクエリするときに、 多次元インデックス が優先的に使用されないように指定します。
  • データ読み取り操作を使用してデータをクエリする

    プライマリキーに基づいてデータを読み取る場合は、データ読み取り操作を使用できます。Tablestore は、1 行のデータを読み取るための GetRow 操作と、複数の行のデータをバッチで読み取るための BatchGetRow や GetRange などの操作を提供しています。詳細については、「データの読み取り」をご参照ください。

    操作

    説明

    シナリオ

    GetRow

    指定されたプライマリキーに基づいて、1 行のデータを読み取ります。

    この操作は、読み取る行のすべてのプライマリキー列の値を特定でき、読み取る行の数が少ないシナリオに適しています。

    BatchGetRow

    1 つ以上のテーブルから複数の行のデータを一度に読み取ります。

    この操作は、読み取る行のすべてのプライマリキー列の値を特定でき、読み取る行の数が多い場合、または複数のテーブルからデータを読み取る場合に適しています。

    GetRange

    プライマリキー値が特定の範囲内にあるデータを読み取ります。

    この操作は、読み取る行のプライマリキー値の範囲またはプライマリキー値のプレフィックスを特定できるシナリオに適しています。

  • セカンダリインデックス を使用する

    重要

    セカンダリインデックス 機能を使用すると、ストレージ料金が発生します。データテーブルにデータを書き込むと、 多次元インデックス を作成し、データを読み取るために計算リソースが消費されます。

    セカンダリインデックス を使用して、SQL 文を実行することでデータをクエリできます。次の手順を実行します。

    1. データテーブルの セカンダリインデックス を作成します。詳細については、「Tablestore コンソールでセカンダリインデックスを使用する」をご参照ください。

      強力な整合性要件を満たすには、ローカルセカンダリインデックス を作成することをお勧めします。

    2. 次のいずれかの方法を使用して、 セカンダリインデックス に基づいて SQL 文を実行してデータをクエリできます。

      たとえば、exampletable という名前のデータテーブルに、pknamecontext のデータ列が含まれており、exampletable_index という名前の セカンダリインデックス がデータテーブルに作成されており、 セカンダリインデックス に上記のデータ列が含まれているとします。

      • 方法 1: データテーブルからデータをクエリするために セカンダリインデックス を明示的に指定する

        SQL 文を実行してデータをクエリするときにインデックスを明示的に指定しない場合、Tablestore はインデックス選択ポリシーに基づいてインデックスを使用するかどうかを自動的に決定します。

        use index() コマンドを使用して セカンダリインデックス が明示的に指定されている次のサンプル SQL 文を実行して、データをクエリできます。

        SELECT pk,name,context FROM exampletable use index(exampletable_index);  -- データテーブルからデータをクエリするために セカンダリインデックス を使用することを明示的に指定します。
      • 方法 2: セカンダリインデックス 用に作成された マッピングテーブル を使用してデータをクエリする

        1. CREATE TABLE 文を実行して、 セカンダリインデックス 用に exampletable_index という名前の マッピングテーブル を作成します。詳細については、「テーブルのマッピングテーブルを作成する」をご参照ください。

        2. 次のサンプル SELECT SQL 文を実行して、 セカンダリインデックス 用に作成された マッピングテーブル を使用してデータをクエリします。

          SELECT pk,name,context FROM exampletable_index;  --  セカンダリインデックス 用に作成された マッピングテーブル を使用してデータをクエリします。