[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 メーリングリストの案内