文字列を比較するための db2 の内部動作とは何ですか?
質問があります
select * from mytab where name='rohit'
各行の名前を値「rohit」と比較する方法
また、インデックスを持つ各 name(varchar) 列のハッシュ コードを持つ列を持つことも考えています。そのため、名前を探すときはいつでも、代わりにハッシュコードを探す必要があります。
このアプローチは実行可能であり、パフォーマンスを向上させることができますか?
文字列を比較するための db2 の内部動作とは何ですか?
質問があります
select * from mytab where name='rohit'
各行の名前を値「rohit」と比較する方法
また、インデックスを持つ各 name(varchar) 列のハッシュ コードを持つ列を持つことも考えています。そのため、名前を探すときはいつでも、代わりにハッシュコードを探す必要があります。
このアプローチは実行可能であり、パフォーマンスを向上させることができますか?
文字列を比較するための DB2 の内部動作は何ですか?
簡単な答えは、大文字と小文字を区別する一致です。
より複雑な答えは、IBM によって提供されます。IBM は複雑な回答で有名です。
2 つの文字列は、各文字列の対応するバイトを比較することによって比較されます。ストリングが同じ長さでない場合、比較は、他のストリングと同じ長さになるように右側にブランクが埋め込まれた短いストリングの一時コピーで行われます。
2 つの文字列が両方とも空の場合、または対応するすべてのバイトが等しい場合、これらの文字列は等しいと見なされます。空の文字列は空白の文字列と同じです。2 つの文字列が等しくない場合、それらの関係 (つまり、値が大きい方) は、文字列の左端からの最初の等しくないバイトのペアを比較することによって決定されます。この比較は、データのエンコード方式に関連付けられた照合順序に従って行われます。ASCII データの場合、文字 A から Z (大文字と小文字の両方) は、文字 0 から 9 よりも大きい値を持ちます。EBCDIC データの場合、文字 A から Z (大文字と小文字の両方) は、文字 0 から 9 よりも小さい値を持ちます。
長さが異なる可変長文字列は、末尾の空白の数だけが異なる場合、同じです。このような値のコレクションから 1 つの値を選択する操作では、選択される値は任意です。このような任意の選択を伴う可能性のある操作は、DISTINCT、MAX、MIN、およびグループ化列への参照です。グループ化列への参照に関連する任意選択の詳細については、GROUP BY の説明を参照してください。
また、インデックスを持つ各 name(varchar) 列のハッシュ コードを持つ列を持つことも考えています。そのため、名前を探すときはいつでも、代わりにハッシュコードを探す必要があります。
このアプローチは実現可能で、パフォーマンスを向上させることができますか?
はい、名前をハッシュできます。いいえ、パフォーマンスの向上は見られません。
その理由は、DB2 がテーブルまたはテーブル インデックスの処理に費やす時間のほとんどが、ディスク入力で使用されるためです。名前インデックスの文字列照合は、処理時間のごく一部です。
実装を検討する可能性のあるものの 1 つは、名前のsoundexマッチングです。
比較は、SQL 言語自体によって定義されます。名前が完全に一致する場合、行は条件に一致します。いくつかのバリエーションがあります。
varchar() の場合、スペースは重要ではなく、デフォルトの動作は大文字と小文字を区別しないようにする必要があります (ただし、DB2 でこれが当てはまるかどうかはわかりません)。
完全一致のインデックスを使用すると、パフォーマンスが向上します。