ORって遅いのね

ひさしぶりに、とあるシステムのパフォーマンスをチューニングしてみた。
Ludiaで全文検索インデックスを使ってみたり、ORM任せにしないで自前でSQLを書いたりで、だいぶさくさく動くようになったっぽい。


知らなかったことがあったのでメモ。ORって遅いのね。
同じ結果を返すようにUNIONで組んだSQLと比べると、36倍程度の差があった。


以下で使用しているテーブルの行数はだいたい
products ... 9万件
product_specs ... 50万件

-- 2.16秒/70件
SELECT DISTINCT
  a.* 
FROM
  products a 
  inner join product_specs b 
    on b.product_id = a.id 
WHERE
  a.title @@ 'テスト' 
  OR b.value @@ 'テスト' 
ORDER BY
  date desc
-- 0.06秒/70件
SELECT
  a.* 
FROM
  products a 
WHERE
  a.title @@ 'テスト'

UNION 

SELECT
  a.* 
FROM
  products a 
  inner join product_specs b 
    on b.product_id = a.id 
WHERE
  b.value @@ 'テスト'

ORDER BY
  date desc


ちなみにORもUNIONも使わずに、片方の条件で検索をかけると0.03秒。ORは本当に遅すぎ。
こんなに違うと、さすがに体感にもだいぶ差が出た。