[pgsql-jp: 41405] 複数のLIKE句 OR で繋ぐと遅い
yasuhara @ restored-live.jp
yasuhara @ restored-live.jp
2013年 5月 30日 (木) 15:39:49 JST
安原と申します。
親テーブル:記事発行テーブル tb_publish と、
子テーブル:記事本文テーブル tb_content (5万レコードくらい)
がありまして、
tb_content の本文カラム`content`(TEXT型)には、
日本語・半角英数字・全角英数字を平均500文字が含まれています。
contentに対して、全角英数字、半角英数字の中間一致を、かけるSQL文を
作りましたが(下記)。
SELECT * FROM tb_publish pub, tb_content con
WHERE pub.publish_id = con.publish_id
AND ( content LIKE '%TEST%' OR content LIKE '%test%' OR content
LIKE '%TEST%' OR '%test%' )
AND publish_date >= '2013-04-01' AND publish_date <= '2013-05-30'
ORDER BY publish_date DESC OFFSET 0 LIMIT 10 ;
LIKE句の文字いかんによっては、3000ms 〜 25000ms かかるも場合があります。
又、発行日publish_date を from 1998-04-01 to 2013-05-30 にすると、700ms
くらい、と少し速くなります。
条件抽出のアルゴリズムなどは勉強不足なので分かりませんが、
上記SQL文の欠点を指摘して頂けると幸いです。
因みに、content側テキストを半角英数字に整形してから中間一致させる以下の
SQL文の速度を
測定してみましたが、
SELECT * FROM tb_publish pub, tb_content con
WHERE pub.publish_id = con.publish_id
AND translate(upper(content),
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ') LIKE '%OTC%'
AND publish_date >= '2013-04-01' AND publish_date <= '2013-05-30'
ORDER BY publish_date DESC OFFSET 0 LIMIT 10 ;
80000ms くらいかかってしまうことがわかりました。
publish_date の範囲していかんによっては、いつ終了するかも分からないとき
もあります。
どうぞよろしくお願いいたします。
pgsql-jp メーリングリストの案内