2017-11-14 5 views
0

現在、ユーザーがサインアップ(またはゲストとして注文)したときにpostgresデータベースのcustomersテーブルを照会しています。 "新しいユーザー。 ユーザーは名前を変更することもできます。それらが実行されるとき、私たちは彼らのプライマリ名を変更しますが、古い名前をalt_fnameとalt_lnameフィールドに保持します。その結果、(ActiveRecordの中に)私たちのwhere句は、私は(fnameは、lnameの上など)いくつかのマルチカラムインデックスを追加したい物事をスピードアップするためにOR文がPostgresクエリの複数列インデックスにどのように影響するか

Customer.where(["(fname = :fname OR alt_fname = :fname) AND (lname = :lname OR alt_lname = :lname)", {fname: first_name, lname: last_name}])

ですが、私は知りませんクエリが単純なANDステートメントではなく、2つのORがANDで結合されている場合には、それらも使用されます。

+0

'OR'sはインデックスの使用をかなり殺します。 –

+0

@GordonLinoffはこれもポストレースでも当てはまりますか? https://www.postgresql.org/docs/9.2/static/indexes-bitmap-scans.html – user5613413

答えて

0

@GordonLinoffが一般的です。

2つのソート済みインデックスlname、user_id、alt_lname、user_idを追加してみてください。私はpostgresのオプティマイザが何をしているのかわかりませんが、多くの人がインデックスを使って検索し、一致率が良くない場合はシーケンシャルに切り替えることになります。カーディナリティが大きい場合は、索引が役立ちます。

スピードが改善されない場合は、lnameの2つのクエリとalt_lnameとreturn user_idを持つクエリのUNIONを試してください。それは組合ALLではないので、まだソートがありますが、それは結果セットでのみ発生し、テーブル全体では発生しません。

関連する問題