2016-11-09 10 views
1

異なるテーブルの電子メールアドレスがさまざまなケースにある現在のクエリは、小文字と小文字を比較する必要があります。しかし、lower()で以下のクエリを実行すると、それを実行するよりも1億倍も遅くなります。WHERE条件が大きいネストループを引き起こす条件

誰かが回避策を提案できますか?

SELECT 
    person_oct.email, 
    unsubs.unsubs_email 
FROM 
    public.unsubs, 
    public.person_oct 
WHERE 
    lower(person_oct.email) = lower(unsubs.unsubs_email) AND 
    unsubs.unsubs_email IS NOT NULL AND 
    unsubs.unsubs_email != '' AND 
    person_oct.email != '' AND 
    person_oct.email IS NOT NULL ; 
+2

どのDBMSを使用していますか?そして、lower()の有無にかかわらず、そのクエリの完全な実行計画は何ですか?それらの2つの列に対して 'lower()'にインデックスを追加することで、改善できるはずです –

+0

この解決策を試してみてくださいhttp://stackoverflow.com/questions/1224364/sql-server-ignore-case-in-a-where -expression – Sparrow

+1

文字列操作でインデックスの使用をブロックすることができます。 – scaisEdge

答えて

0

多くのSQLサーバーでは、文字列比較ではデフォルトで大文字と小文字が区別されます。 lower()コールは必要ありません。

where-blockの最初の3行に暗黙のうちに、クエリの最後の2行は必要ありません。

+0

「多く」は誇張です。 Postgres、DB2、Oracle、Firebird、Ingres、Informix、Vertica、Teradataは、デフォルトで大文字と小文字を区別する文字列の比較を行います。私はそれが唯一のSQL Server(とそのいとこのSybase)とMySQLでないと思う –

+0

私はPOSTGRESを使用しており、それは違いをもたらした。私はちょうど列の電子メール=上の(電子メール)を変更するだけで終わった。チートのビットが完全に違いを作った。 –