

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 書き込みシャーディングを使用してワークロードをパーティション間で均等に分散させる
<a name="bp-partition-key-sharding"></a>

Amazon Keyspaces のパーティションで効率的な書き込みの分散を行う方法として、スペースの拡張があります。これにはさまざまな方法があります。乱数を書き込んだパーティションキー列を追加して、パーティション間で行を分散させることができます。または、クエリ対象に基づいて計算された数値を使用することができます。

## 複合パーティションキーと乱数値を使用したシャーディング
<a name="bp-partition-key-sharding-random"></a>

パーティション全体に均等にロードを分散させるための戦略として、乱数を書き込んだパーティションキー列を追加する方法があります。次に、より大きなスペース全体の書き込みをランダム化します。

例えば、次のテーブルに、日付を表すパーティションキーが 1 つあるとします。

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date,
   title text,
   description int,
   PRIMARY KEY (publish_date));
```

このテーブルをパーティション間で均等に分散するために、乱数が保存されている追加のパーティションキー列 `shard` を含めることができます。例:

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date, 
   shard int, 
   title text, 
   description int, 
   PRIMARY KEY ((publish_date, shard)));
```

データを挿入するときに、`shard` 列に対して `1`～`200` の乱数を選択するとします。これにより、`(2020-07-09, 1)` や `(2020-07-09, 2)` などから `(2020-07-09, 200)` までの複合パーティションキーバリューが生成されます。パーティションキーをランダム化しているため、毎日のテーブルへの書き込みは複数のパーティション間で均等に分散されます。これにより、並列性が強化され、全体的なスループットが向上します。

ただし、特定の日のすべての行を読み取るには、すべてのシャードの行をクエリしてから結果をマージする必要があります。例えば、まず、パーティションキーバリュー `(2020-07-09, 1)` に対して `SELECT` ステートメントを発行したとします。次に、`(2020-07-09, 2)` などから `(2020-07-09, 200)` までに対して別の `SELECT` ステートメントを発行します。最終的には、アプリケーションを使用して、これらすべての `SELECT` ステートメントの結果をマージする必要があります。

## 複合パーティションキーと計算値を使用したシャーディング
<a name="bp-partition-key-sharding-calculated"></a>

ランダム化の方法は、書き込みスループットを大幅に向上させることができます。しかし、行が書き込まれたときに `shard` 列にどの値が書き込まれたのかわからないため、特定の行の読み取りが難しくなります。個々の行の読み取りを容易にするために、別の戦略を使用することができます。パーティション間で行を分散させるには、乱数を使用せずに、クエリする項目に基づいて計算できる数値を使用します。

前の例では、パーティションキーで今日の日付が使用されています。各行にはアクセス可能な `title` 列があり、日付別に加えてタイトル別に行を頻繁に検索する必要があるとします。アプリケーションでは、テーブルに行が書き込まれる前に、タイトルに基づいてハッシュ値が計算され、それを使用して `shard` 列が入力されます。この計算では、1 から 200 までの数値が生成され、ランダムな方法と同様に、完全に均一に分散されます。

この計算はシンプルな計算で十分です (タイトルの文字の UTF-8 コードポイント値を乗算して、それを 200 で割った余りに \$1 1 するなど)。複合パーティションキーバリューは、日付と計算結果を組み合わせた値になります。

この方法を使用すると、書き込みがパーティションキーバリュー全体に均一に分散されます。したがって、物理パーティション全体にも均一に分散されます。これで、特定の `title` 値のパーティションキーバリューを計算できるため、特定の行と日付に対して簡単に `SELECT` ステートメントを実行できます。

特定の日のすべての行を読み取るには、`(2020-07-09, N)` キー (ここで `N` は 1〜200) を `SELECT` する必要があり、アプリケーションはすべての結果をマージする必要があります。この方法には、すべてのワークロードを利用する単一の「ホット」パーティションキーバリューを使用しないというメリットがあります。