このドキュメントで読んでいることを理解するのを手伝ってもらえますか? https://crate.io/docs/reference/sql/partitioned_tables.html
これらの表の例では、列id long
はprimary_key
;ではありません。実際、id
ここでは主キーにすることはできません。なぜなら、以下に示すように、「主キーが設定されている場合は、PARTITION BY
句に存在する必要がある」ためです。
私のアプリでは、歴史的にprimary key
onがありましid string NOT NULL
たが、今は、例のように生成された日付列で、このテーブルにパーティショニングを追加したいと考えていますpartition_date timestamp GENERATED ALWAYS AS date_trunc('day', created_at)
。日付列でのパーティショニングは、期間によって範囲を絞ったクエリの速度に役立ち (たとえば、今日のすべてのレコードをカウントすると、今日のパーティションにしかヒットしない)、データの古いフレーム (たとえば、180 日を超えるもの) をアーカイブするのに役立つことを読みました。 )、しかし、単一の PK ルックアップのパフォーマンスを低下させたくありません。
では、ただではできないので、私がPARTITIONED BY (partition_date)
...
id
a) ?から主キー制約を削除します。これが単一行のルックアップのパフォーマンスに影響を与えるのではないかと心配しています! このコンテキストでは、PK がパーティション キーに含まれている必要があることは理にかなっています。これは、ルックアップWHERE id = "abc-123"
が理想的には 1 つのノードにヒットするだけでよいためです。
また
b) 両方の列を次のようにパーティション キーとして使用するPARTITIONED BY (id, partition_date)
-- これは奇妙に思えます。本能的に、これはid
カーディナリティが高く、パーティション列には不適切な選択であり、「日」または「月」の方が適切であると想定したいからです。あなたのドキュメントの例にそのようなものが示されています。この場合、私の PK ルックアップはすべてのパーティションにヒットしていますか、それともどこに行くべきかを正確に知っていますか? 今日のみを対象とした集計クエリを実行すると、すべてのパーティションにヒットするのでしょうか?それとも今日のデータを保持しているパーティションだけにヒットするのでしょうか?