クエリパフォーマンスの向上について、ApsaraDB for SelectDB では、LRU および TTL ポリシーを適切に設定し、キャッシュプリフェッチ機能を使用して特定のテーブルまたはパーティションのデータをプリフェッチすることで、クエリパフォーマンスを向上させることができます。 このトピックでは、ApsaraDB for SelectDB のデータキャッシュ機能について説明します。
背景情報
ApsaraDB for SelectDB は、メモリキャッシュとデータキャッシュの 2 種類のキャッシュを提供します。これらは、内容および管理ポリシーが異なります。
メモリキャッシュ
定義: インメモリキャッシュは、ApsaraDB for SelectDB コンピュートノードのメモリに割り当てられたキャッシュ領域です。これは、頻繁にアクセスされるデータブロックやメタデータなどのホットデータを一時的に格納します。
キャッシュ対象の内容:
メタデータ:テーブル構造、パーティション情報、統計情報など。
データブロック:Parquet や ORC ファイルブロックなど、ホットデータのカラム指向ストレージブロック。
管理ポリシー:
ベストエフォート方式:メモリ容量が不足した場合、アクセス頻度の低いコールドデータから順にエビクションされます。
最近使用されていない順(LRU):頻繁にアクセスされるデータをメモリに保持する一般的なエビクションポリシーです。
データキャッシュ(クラウドディスクベース)
定義: データキャッシュとは、ApsaraDB for SelectDB が SSD などのクラウドディスクに割り当てる永続的なキャッシュレイヤーです。メモリとオブジェクトストレージ (S3 など) の間のセカンダリキャッシュとして機能し、より大容量のウォームデータを格納します。
キャッシュされたコンテンツ:
データキャッシュは、主にオブジェクトストレージから読み込まれたカラム指向データブロック、およびカラムインデックスや辞書エンコーディングなどの補助構造を格納します。
データがデータキャッシュに入るタイミングは、シナリオによって異なります。
データのインポート時: 新規にインポートされたデータは、初期アクセスを高速化するために非同期でキャッシュに書き込まれます。
クエリ実行時: 要求されたデータがキャッシュに存在しない場合、システムはリモートストレージからデータをメモリに読み込み、その後、ローカルディスクキャッシュに書き込んで次回以降のクエリに備えます。
新規クラスターの作成時: リモートストレージ上のデータは複数のクラスター間で共有可能ですが、キャッシュは共有されません。新規に作成されたクラスターは空のキャッシュから開始します。この場合、キャッシュプリフェッチ機能を活用して、リモートストレージから必要なデータを事前にローカルキャッシュに読み込むことができます。例については、「例:キャッシュプリフェッチ機能の使用」をご参照ください。
管理ポリシー:
階層化ストレージ: アクセス頻度に基づいてデータが自動的に移動されます。ホットデータはクラウドディスクキャッシュに保存され、コールドデータはオブジェクトストレージに保存されます。
キャッシュプリフェッチ: 今後アクセスされると予測されるデータを、手動または自動で事前に読み込みます。
本トピックでは、クラウドディスクベースのデータキャッシュに焦点を当てます。
キャッシュポリシー
ApsaraDB for SelectDB のキャッシュは、Least Recently Used (LRU) と Time-to-Live (TTL) のポリシーをサポートしています。テーブルのキャッシュポリシーは、そのパラメーターを調整することで制御できます。
キャッシュポリシー | ユースケース | 説明 |
LRU ポリシー | LRUポリシーは、 ApsaraDB for SelectDB のテーブルに対するデフォルトのキャッシュポリシー。 このポリシーは、ほとんどのユースケースに適しています。 | このポリシーで管理されるデータは、キャッシュ内にキュー形式で保持されます。 クエリがキャッシュ内のデータブロックにヒットした場合、そのブロックはキューの先頭に移動されます。 新しいデータがキャッシュに書き込まれる際は、キューの先頭に配置され、早期のエビクションを防ぎます。 キャッシュが満杯になった場合、キューの末尾にあるデータが最初にエビクションされます。 |
TTL ポリシー | 総データ量がキャッシュ容量を大幅に上回り、かつ一部のデータセットが他のデータセットよりも優先度が高い場合に、このポリシーを使用します。 たとえば、データベースに 10 個のテーブルがあり、合計データ量が 1 TB である一方、購入したキャッシュ容量は 200 GB しかなく、すべてのデータをキャッシュするには不十分である場合があります。そのうち 1 つのテーブルが他のテーブルよりもはるかに頻繁にアクセスされる場合は、そのテーブルのキャッシュポリシーを TTL に変更することを検討してください。 | TTL ポリシーでは、データがキャッシュに書き込まれた後、指定された期間内に高優先度データがエビクションされないようにします。 有効期限は、以下の数式で計算されます: TTL ポリシーが適用されたデータは、キャッシュ管理において最も高い優先度を持ちます。ここでいう「最も高い優先度」とは、キャッシュが満杯の場合、システムが新しい TTL データを収容するために LRU キュー内のデータをエビクションすることを意味します。「同等の優先度」とは、TTL ポリシーが適用されたすべてのデータが、残存する有効期限に関係なく、エビクション時に同様に扱われることを意味します。 キャッシュが TTL ポリシーのデータで満杯になった場合、TTL ポリシーが適用された新規インポートデータや、リモートストレージから読み込まれたコールドデータなど、新たなデータはキャッシュに書き込まれません。 重要 これは実験的な機能であり、本番環境での使用は推奨されません。 |
キャッシュプリフェッチポリシー
ApsaraDB for SelectDB インスタンスは、1 つ以上のクラスターで構成されます。これらのクラスターは、保存されているデータを共有しますが、キャッシュデータは共有しません。新しく作成されたクラスターのキャッシュは空であるため、初期クエリが遅くなる可能性があります。この問題に対処するため、キャッシュプリフェッチを使用して、リモートストレージからローカルキャッシュにデータを事前にロードできます。
キャッシュプリフェッチは、以下の 3 種類のモードをサポートしています:
クラスター A のキャッシュからクラスター B へデータをプリフェッチする: ApsaraDB for SelectDB は、各クラスターが一定の時間枠内でアクセスするテーブルまたはパーティションのホットスポット情報を定期的に収集し、、 内部テーブルに保存します。 クラスター間のプリフェッチ中に、送信先クラスターはソースクラスターからのホットスポット情報を使用して、特定のテーブルまたはパーティションのデータをプリフェッチします。
指定されたテーブルから新規クラスターへデータをプリフェッチ。
指定されたテーブルの特定パーティションから新規クラスターへデータをプリフェッチ。
キャッシュ領域の管理
キャッシュサイズの設定
キャッシュサイズは、ApsaraDB for SelectDB インスタンスおよびクラスターを作成するときに指定できます。詳細については、「インスタンスの作成」をご参照ください。
キャッシュサイズの確認
SelectDB コンソールにログインします。インスタンス一覧ページで、対象インスタンスのインスタンス IDをクリックし、インスタンスの詳細ページに移動します。その後、クラスター管理をクリックして、キャッシュサイズを確認します。
例:キャッシュプリフェッチ機能の使用
このセクションでは、cluster_name0 から cluster_name1 へのデータプリフェッチを例として、3 種類のキャッシュプリフェッチモードを紹介します。
ステップ 1:ホットデータの特定
インスタンス内の、キャッシュホットスポット情報を保持するクラスターをクエリします。
SHOW CACHE HOTSPOT '/';クエリ結果より、cluster_name0 がキャッシュホットスポット情報を保持するクラスターであることがわかります。
SHOW CACHE HOTSPOT '/'; +------------------------+-----------------------+----------------------------------------+ | cluster_name | total_file_cache_size | top_table_name | +------------------------+-----------------------+----------------------------------------+ | cluster_name0 | 751620511367 | regression_test.selectdb_cache_hotspot | +------------------------+-----------------------+----------------------------------------+指定されたクラスター cluster_name0 のキャッシュホットスポット情報を表示します。
SHOW CACHE HOTSPOT '/cluster_name0';クエリ結果の top_partition_name 列より、customer テーブルに属するホットパーティション p20230529 が確認できます。
+-----------------------------------------------------------+---------------------+--------------------+ | table_name | last_access_time | top_partition_name | +-----------------------------------------------------------+---------------------+--------------------+ | regression_test.selectdb_cache_hotspot | 2023-05-29 12:38:02 | p20230529 | | regression_test_cloud_load_copy_into_tpch_sf1_p1.customer | 2023-06-06 10:56:12 | p20230529 | | regression_test_cloud_load_copy_into_tpch_sf1_p1.nation | 2023-06-06 10:56:12 | nation | +-----------------------------------------------------------+---------------------+--------------------+customer テーブルのホットパーティション情報を表示します。
説明テーブルが 1 つのパーティションのみを持つ場合、パーティション名はテーブル名と同じになります。
SHOW CACHE HOTSPOT '/cluster_name0/regression_test_cloud_load_copy_into_tpch_sf1_p1.customer';以下の結果が返されます。
+----------------+---------------------+ | partition_id | partition_name | +----------------+---------------------+ | 422831494463 | p20230529 | +----------------+---------------------+
ステップ 2:キャッシュプリフェッチジョブの作成
以下に、3 種類のキャッシュプリフェッチモードの例を示します。
クラスター内では、同時に実行できるキャッシュプリフェッチジョブは 1 つだけです。
cluster_name0 のキャッシュから cluster_name1 へプリフェッチ。
WARM UP CLUSTER cluster_name1 WITH CLUSTER cluster_name0
cluster_name0 の customer テーブルから cluster_name1 へプリフェッチ。
WARM UP CLUSTER cluster_name1 WITH TABLE customercluster_name0 の customer テーブルの p20230529 パーティションから cluster_name1 へプリフェッチ。
WARM UP CLUSTER cluster_name1 WITH TABLE customer PARTITION p20230529
ステップ 3:キャッシュプリフェッチジョブの管理
キャッシュプリフェッチジョブの JobId をクエリします。
WARM UP CLUSTER cluster_name1 WITH TABLE customer; +-------+ | JobId | +-------+ | 13418 | +-------+ 1 row in set (0.01 sec)キャッシュプリフェッチジョブの進行状況をクエリします。
FinishBatch および AllBatch の値に基づいてジョブの進捗を確認します。各バッチは約 10 GB です。
SHOW WARM UP JOB WHERE ID = 13418;以下の結果が返されます。
+-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ | JobId | ClusterName | Status | Type | CreateTime | FinishBatch | AllBatch | FinishTime | +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ | 13418 | cluster_name1 | RUNNING | TABLE | 2023-05-30 20:19:34.059 | 0 | 1 | NULL | +-------+-------------------+---------+-------+-------------------------+-------------+----------+------------+ 1 row in set (0.02 sec)キャッシュプリフェッチジョブをキャンセルします。
JobId を指定してキャッシュプリフェッチジョブをキャンセルできます。
ジョブをキャンセルします。
CANCEL WARM UP JOB where id = 13418;結果:
Query OK, 0 rows affected (0.02 sec)ジョブがキャンセルされたことを確認します。
SHOW WARM UP JOB WHERE ID = 13418;結果の Status が CANCELLED である場合、ジョブのキャンセルが正常に完了したことを示します。
+-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+ | JobId | ClusterName | Status | Type | CreateTime | FinishBatch | AllBatch | FinishTime | +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+ | 13418 | cluster_name1 | CANCELLED | TABLE | 2023-05-30 20:19:34.059 | 0 | 1 | 2023-05-30 20:27:14.186 | +-------+-------------------+-----------+-------+-------------------------+-------------+----------+-------------------------+ 1 row in set (0.00 sec)
例:TTL ポリシーの使用
TTL ポリシーの設定
テーブルを作成する際に、PROPERTIES 内で file_cache_ttl_seconds パラメーターを設定することで、TTL ポリシーを適用できます。
file_cache_ttl_seconds パラメーターは、新規にインポートされたデータをキャッシュに保持する秒数を指定します。
customer テーブルに新規にインポートされたすべてのデータは、キャッシュ内に 300 秒間保持されます。
CREATE TABLE IF NOT EXISTS customer (
C_CUSTKEY INTEGER NOT NULL,
C_NAME VARCHAR(25) NOT NULL,
C_ADDRESS VARCHAR(40) NOT NULL,
C_NATIONKEY INTEGER NOT NULL,
C_PHONE CHAR(15) NOT NULL,
C_ACCTBAL DECIMAL(15,2) NOT NULL,
C_MKTSEGMENT CHAR(10) NOT NULL,
C_COMMENT VARCHAR(117) NOT NULL
)
DUPLICATE KEY(C_CUSTKEY, C_NAME)
DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 32
PROPERTIES(
"file_cache_ttl_seconds"="300" --TTL を設定
)TTL ポリシーの変更
ApsaraDB for SelectDB では、テーブルの Time to Live (TTL) を変更できます。TTL を延長または短縮する場合や、テーブル作成時に TTL を設定しなかった場合は、`ALTER` 文を使用して `file_cache_ttl_seconds` パラメーターを設定し、TTL を調整できます。
変更が反映されるまで若干の遅延が発生する場合があります。
ALTER TABLE customer set ("file_cache_ttl_seconds"="3000");