問題タブ [b-tree-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - B ツリー インデックス作成: データベースはどのインデックスが必要なレコードを参照するのか
次のことが理解できなくて困っています。
名前のテーブルがあるとしましょう: Maria
, José
, John
, Isabel
... 名前を検索して、名前Maria
を持つすべての行を取得したいとしましょうMaria
。これは大きなテーブルなので、実装しますB-Tree
(B ツリーは範囲でうまく機能することはわかっていますが、念のために仮定しておきましょう)。これで、テーブルの各行にインデックスが作成され、データベースはそのインデックスを使用して、B-Tree
. しかし、私が理解していないこと。私が言うなら
Maria が 9834759 というインデックスを持っていることを、データベースはどのようにして知るのでしょうか? つまり、それはデータベースのどこかに書かれている必要がありますが、インデックスを持つ各名前をWHERE
句で指定された私の名前と比較する必要があるため、検索には再び多くの時間がかかる可能性があります。
B-Tree に従うのに問題があるのは理解できますか? それとも、データベース内の実装ですか?
postgresql - Postgresql プランナーが「NOT」クエリのインデックスを選択しない
[説明の更新を反映してタイトルを更新]
Postgresql 9.6 を実行しています
期待するインデックスを使用していない複雑なクエリがあります。この小さな例に分解すると、インデックスが使用されていない理由がわかりません。
これらの例は、100 万レコードのテーブルで実行され、現在、すべてのレコードの列状態の値が「COMPLETED」になっています。状態はテキスト列で、btree インデックスがあります。
次のクエリでは、期待どおりにインデックスを使用しています。
Ⅴ
しかし、自分のテーブルを参照する select に何か他のものを追加すると、プランナーは代わりに順次スキャンを実行することを選択します。
Ⅴ
この単純な例でも同じ問題があります。
インデックスを使用:
インデックスを使用しない:
[更新] (この場合) そこで使用しているインデックスは INDEX ONLY であることを理解しました。この場合、型もインデックスに含まれていないため、その使用を停止します。したがって、おそらく問題は、以下の「Not」の場合になぜそれを使用しないのかということです:
テーブルにない別の値を使用する場合、インデックスを使用することを知っています (これは理にかなっています)。
しかし、私がそうしなければ、そうではありません:
インデックスが使用されないのはなぜですか?
確実に使用するにはどうすればよいですか?
ほとんどの場合、このテーブルのほぼすべてのレコードが多くの最終状態 (IN 演算子を使用) のいずれかにあると思います。したがって、より複雑なクエリを実行するときは、これらのレコードがクエリのより高価な部分から早期かつ迅速に除外されることを期待しています。
[更新]
「NOT」は、サポートされている B ツリー操作ではないようです。ある種のユニークなアプローチが必要になります: https://www.postgresql.org/docs/current/indexes-types.html#INDEXES-TYPES-BTREE
次の部分インデックスを追加しようとしましたが、機能していないようです。
この部分インデックスは機能しますが、理想的なソリューションではありません。
私もこの表現インデックスを試しましたが、理想的ではありませんでしたが、うまくいきませんでした:
等号を持つ状態のリスト (In Clause) を使用すると機能します。したがって、NOT を使用しないようにするには、より大きなクエリを理解する必要があるかもしれません。