3

Scylla DB は、いわゆる「キー プレフィックスの最適化」をセカンダリ インデックスに実装します。これにより、プライマリ キーの一部が指定されている場合にフィルタリングが不要になります。SELECT * FROM A WHERE a = 'a' AND b = 'a' AND d = 'a';たとえば、 tableで実行できますA

CREATE TABLE A (
    a text,
    b text,
    c text,
    d text,
    PRIMARY KEY(a,b,c)
);
CREATE INDEX A_index ON A (d);

A.dただし、クラスタリング列の場合は機能しません。たとえば、B下の表のように。

CREATE TABLE B (
    a text,
    b text,
    c text,
    d text,
    PRIMARY KEY(a,b,c,d)
);
CREATE INDEX B_index ON B (d);

上記の SELECT クエリは次のエラーで失敗します。

InvalidRequest: サーバーからのエラー: code=2200 [無効なクエリ] message="このクエリを実行できません。データ フィルタリングが必要なため、パフォーマンスが予測できない可能性があります。パフォーマンスが予測できないにもかかわらずこのクエリを実行する場合は、ALLOW FILTERING を使用してください"

スキュラDB 3.0.1。

4

1 に答える 1

4

興味深いコーナーケースを見つけてくれてありがとう:)

問題は、2 番目のクエリがクラスタリング列を制限すること(b, d)であり、それ自体はクラスタリング キー プレフィックスを形成しません。もちろん、dインデックスが作成されているため、キープレフィックスの最適化とインデックス付きの列として使用する必要があります。ad

代わりに、 はプレフィックスを形成しないと誤って判断されたため、 がインデックス(b, d)を持つことを考慮せずに、最適化候補から破棄されます。d

この単純化は修正される予定です。ここにバグ トラッカーの問題を作成しました: https://github.com/scylladb/scylla/issues/4178

于 2019-02-01T08:26:21.210 に答える