PostgreSQL v8.2.3を使用しています。
関係するテーブルがあります:[〜#〜]従業員[〜#〜]および[〜#〜]メールリスト[〜#〜]。
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
2つのテーブルは、EMPLOYEE.EMAIL1またはEMPLOYEE.EMAIL2のいずれかに一致するエントリがない場合にそれらの行が返されるように結合されます。
SELECT employee.email1, employee.email2,
e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
FROM employee
LEFT JOIN emaillist e1 ON e1.email = employee.email1
LEFT JOIN emaillist e2 ON e2.email = employee.email2
WHERE e1.email IS NULL OR e2.email IS NULL
EMAIL
テーブルのvarchar(256)である列EMAILLIST
にインデックスが付けられます。現在、応答時間は14秒です。
テーブル数の統計:現在、EMPLOYEEには165,018件のレコードがあり、EMAILLISTには1,810,228件のレコードがあり、両方のテーブルが将来成長すると予想されます。
注:私の実際の要件/ユースケースについて詳しく説明します ここ 。
Varchar列に基づいてクエリを実行する場合は、varchar列のインデックス付けに問題はありません。ただし、一部のインデックスには制限があり、単一のフィールドでインデックスを作成できる量に制限があることに注意してください。たとえば、無制限の量のテキストを含むことができる列にインデックスを付けることはできません。ただし、varchar(256)で問題なくインデックスを作成できるはずです。試してみて、クエリのパフォーマンスの改善を分析して、効果があるかどうかを確認してください。
Varchar列自体にインデックスを付ける問題はありません。
問題になる可能性があるのは、10億行のテーブルのFKとしてvarchar列がある場合です。その後、PKとFKの代理キーがありますが、それでも自然なvarcharキーに一意の制約/インデックスが必要です。
テーブルは非常に小さく、パフォーマンスはOR句に関連している可能性があります。残念ながら、クエリをどのように構造化しても同じ問題が発生します(そして、PostgresSQLを十分に理解していないため、すみません)
クエリの "OR e2.email IS NULL"の部分を削除してみて、実行速度を確認してください。実行速度が速い場合は、 "union all 」