web-dev-qa-db-ja.com

列/テーブルに設定するのではなく、クエリの一部として「COLLATE」を含めることでパフォーマンスの問題はありますか?

PostgreSQLにはこの「照合」概念があります。テーブルの列に常に「照合」を設定するか、クエリで行うことができます。

クエリでそれを行う場合、PGは何らかの形でパフォーマンスを低下させますか?つまり、「オンザフライ」で計算するのではなく、特定の「照合」を持つようにテーブル/列に指示すると、「それ自体を準備」できることは理にかなっていますが、そうですか?

また、クエリまたはテーブル/列の定義で照合を使用する必要があるかどうかに関する一般的なヒントはありますか?

3
Duaine

PostgreSQL照合の専門家ではありませんが、PostgreSQLを少し使用して(主にSQL Serverを使用しています)、この特定の情報が、これから説明する情報とどのように/異なるのかわかりません。

短い答え:依存します(標準的な答え)。

実際の答え:列レベルで照合順序を指定します(照合順序がエンコーディング/文字セットから完全に独立していると仮定します。これは、PostgreSQLなどの場合、 is の場合ですが、SQL Serverではエンコーディングは照合の一部です)はデフォルトであり、COLLATE句を介して照合を明示的に提供しないすべてのソートおよび比較操作に使用されます。データのストレージはエンコーディング/文字セット(つまり、Windows-1252 vs UTF-8 vs UTF-16 vsなど)の影響を受けますが、照合はのルールにすぎないため、保存されているデータには照合は影響しません。データを処理する

つまり、「依存する」部分は、インデックスを作成する場合、列の照合の規則を使用して物理的に that データ(つまり、インデックスキーを別の構造に格納)を格納します。 (インデックスの作成時にCOLLATE句を指定し、すべてのRDBMSがそれを許可している場合を除きます)。次に、インデックスで使用される照合順序とは異なるCOLLATE句をクエリで指定すると、そのインデックスを使用しないため、パフォーマンスが低下します。ただし、列の照合でインデックスが使用できない場合に列の照合とは異なる照合をクエリで指定しても、クエリの前にどちらの照合でもデータが並べ替えられていなかったため、パフォーマンスの問題にはなりません。

2
Solomon Rutzky

列の定義でCOLLATEを使用しても、(たとえば)ORDER BY句で使用しても、支払う価格は常に同じです。その理由は、照合は文字列の格納方法には影響せず、文字列の比較方法にのみ影響するためです。これはクエリ時に発生します。

一部の照合順序は他の照合順序よりも高価であり、最も安いのはCなので、可能な限りそれを使用します。

インデックスを使用したクエリを高速化したい場合、CREATE INDEXステートメントはクエリと同じCOLLATE句を使用する必要があります。 CREATE INDEXまたはクエリでCOLLATE句を指定しない場合、列の照合順序が使用されます。これが列定義で照合順序を指定する正当な理由ですが、それはパフォーマンス自体ではなく、使いやすさに関係しています。

2
Laurenz Albe

テーブルに照合順序を設定すると、その列でorder byまたはgroup by句がいつ使用されるかを意味します。これにより、列がデフォルトで使用されるため、いくつかの入力を節約できます。

https://www.postgresql.org/docs/current/collat​​ion.html

パフォーマンス異なる照合順序間の速度の違い以外に影響はありません。

データはその特定の順序で保存されません。列に照合を設定するときの重要な問題の1つは、照合の派生です。

式の照合の派生は、暗黙的または明示的です。この区別は、式に複数の異なる照合が出現する場合の照合の組み合わせ方法に影響します。 COLLATE句を使用すると、明示的な照合の派生が発生します。他のすべての照合の派生は暗黙的です。関数呼び出しなどで複数の照合を組み合わせる必要がある場合は、次のルールが使用されます。

入力式に明示的な照合の派生がある場合、入力式間で明示的に派生したすべての照合は同じでなければなりません。そうでない場合、エラーが発生します。明示的に導出された照合が存在する場合、それは照合の組み合わせの結果です。

それ以外の場合は、すべての入力式に同じ暗黙的な照合の派生またはデフォルトの照合が必要です。デフォルト以外の照合が存在する場合、それは照合の組み合わせの結果です。それ以外の場合、結果はデフォルトの照合になります。

入力式間にデフォルト以外の暗黙的な照合が競合している場合、その組み合わせは不確定な照合と見なされます。呼び出される特定の関数が、適用する照合の知識を必要としない限り、これはエラー状態ではありません。存在する場合、実行時にエラーが発生します。

記載されていないことが1つあります。または、何も見つかりません。

わからない

create index 

列に照合が定義されている場合はどうなりますか?

私はそれが別の興味深い問題の質問を引き起こすその照合を使用すると思います
列間で照合が異なる複合インデックスの場合上記のルールに従うと思います。

0
zsheep