0

私が理解している限りCOUNTDISTINCTまたはLIKE %query%(両側にワイルドカード) キーワードを使用して SQL クエリを実行すると、インデックスは使用できず、データベースはテーブル全体のスキャンを実行する必要があります。

これらのクエリのパフォーマンスを向上させる方法はありますか?

彼らは本当にインデックスを使用できないのでしょうか、それとも何らかの方法でこれを修正できますか?

1 つの列のみを返す必要がある場合、インデックスのみのスキャンを実行できますか? 例: select count(id) from MY_TABLE: おそらくこの場合、「id」にインデックスがある場合、インデックスのみのスキャンを行い、テーブル全体へのヒットを回避できますか?

私の質問には一般的な意味があります。前述の演算子を使用する必要がある場合のパフォーマンスのガイドラインを教えてください。

更新私はPostgreSQLを使用しています。

4

1 に答える 1

0

PostgreSQL では、テキスト文字列の GIN pg_trgm インデックスを作成して LIKE '%foo%' を高速化できますが、これにはアドオンと PostgreSQL 9.1 以降が必要です。

私は、distinct 自体がインデックスを使用することはないと思います。私は実際に試してみましたが、それを使用することができませんでした。再帰的な CTE を使用して個々のレコードを引き出すことで、インデックスを強制的に使用することができます (「スパース スキャン」と呼ばれるもの)。会計記録から個々の年を引き出すとき、私たちはこのようなことをします。ただし、これには特別なクエリを作成する必要があるため、実際には一般的なケースではありません。

count(*) は、mvcc の規則により、インデックスを使用することはできません。ただし、適切なシステム カタログを調べることで、おおよその結果を得ることができます。

于 2013-05-15T00:55:13.547 に答える