ssenou
sseno****@techn*****
2007年 12月 13日 (木) 17:04:06 JST
瀬能です。 すいません、括弧をつけ忘れていました。 正しくは下記です。 SELECT * FROM table1,table2 WHERE table1.id = table2.id AND (table1.data @@ 'TEST' or table2.data @@ 'TEST') 勘違いしていた様で、少し質問を変えさせて下さい。 table1.dataを件名 table2.dataを本文 と見なし 検索対象が"件名又は本文"の場合という検索で 全文検索を実行させたい場合、何かいい方法ありませんか? これくらいしか思い付かなかったのですが… SELECT * FROM table1,table2 WHERE (select id from table1 where data @@ 'AAA') = (select id from table2 where data @@ 'AAA') よろしくお願いします。 ----- Original Message ----- From: <kousa****@nttda*****> To: <ludia****@lists*****> Sent: Thursday, December 13, 2007 4:04 PM Subject: [Ludia-users 147] Re: 複数のテーブルに対する全文検索について > 幸坂です。 > > SELECT * FROM table1,table2 > WHERE > table1.id = table2.id AND > (table1.data @@ 'TEST' or table2.data @@ 'TEST'); > と間違えていませんか? > >> SELECT * FROM table1,table2 >> WHERE >> table1.id = table2.id AND >> table1.data @@ 'TEST' or table2.data @@ 'TEST' > ORよりANDのほうが優先順位が高いため、このクエリは、 > SELECT * FROM table1,table2 > WHERE > (table1.id = table2.id AND > table1.data @@ 'TEST') or table2.data @@ 'TEST'; > と同じです。 > > http://www.postgresql.jp/document/pg825doc/html/sql-syntax-lexical.html > 表 4-1. 演算子の優先順位(強いものから) > >> -----Original Message----- >> From: ludia****@lists***** >> [mailto:ludia****@lists*****] On Behalf Of ssenou >> Sent: Thursday, December 13, 2007 3:15 PM >> To: ludia****@lists***** >> Subject: [Ludia-users 146] Re:複数のテーブルに対する全文検索について >> >> すいません。 >> >> クエリを間違えていました。 >> >> 下記でお願いします。 >> >> SELECT * FROM table1,table2 >> WHERE >> table1.id = table2.id AND >> table1.data @@ 'TEST' or table2.data @@ 'TEST' >> >> >> ----- Original Message ----- >> From: <kousa****@nttda*****> >> To: <ludia****@lists*****> >> Sent: Thursday, December 13, 2007 2:33 PM >> Subject: [Ludia-users 145] Re: 複数のテーブルに対する全文検索について >> >> >> > 幸坂です。 >> > >> >>> ・postgresql.conf にenable_seqscan = off と記述する。 >> >> この設定をして明示的にERRORが発生するようにしています。 >> > enable_seqscanとludia.enable_seqscanは別です。 >> > enable_seqscanをoffにすると、シーケンシャルスキャンのコストが高くなり、 >> > インデックススキャンが使われやすくなります。 >> > Ludia以外のコストも変わってしまうので注意して下さい。 >> > 瀬能さんが設定したludia.enable_seqscan = offは、 >> > シーケンシャルスキャンの時にERRORが発生しますが、 >> > コスト計算とは全く関係ありません。 >> > enable_seqscanを試してみてください。 >> > >> > >> >>>> SELECT * FROM test1,test2 >> >>>> WHERE table1.data @@ 'TEST' or table2.data @@ 'TEST' >> > このクエリは、table1で1件以上ヒットすると、 >> > table2のレコードが全て結果レコードに含まれます。 >> > つまり、table2は全レコードがアクセスされる可能性が高いです。 >> > 同様に、table1も全レコードがアクセスされる可能性が高いです。 >> > >> > 全レコードがアクセスされている場合にインデックススキャンを行うと、 >> > 全レコードに加えてインデックスにもアクセスする必要があり、 >> > ディスクアクセスが多くなってしまいます。 >> > そのため、今回のプランではシーケンシャルスキャンが選択されています。 >> > >> > クエリは間違っていないですよね? >> > >> >> -----Original Message----- >> >> From: ludia****@lists***** >> >> [mailto:ludia****@lists*****] On >> Behalf Of ssenou >> >> Sent: Thursday, December 13, 2007 11:53 AM >> >> To: ludia****@lists***** >> >> Subject: [Ludia-users 144] Re:複数のテーブルに対する全文検索について >> >> >> >> 回答ありがとうございます。 >> >> >> >> > レコードが1行しかないため、シーケンシャルスキャンのほうが >> >> > 高速と判断されています。 >> >> >> >> データを10万行でも試してみたのですが、 >> >> 1行も10万行も実行計画に変化が無いので >> >> サンプルを1行として質問していました。 >> >> >> >> > ・postgresql.conf にenable_seqscan = off と記述する。 >> >> >> >> この設定をして明示的にERRORが発生するようにしています。 >> >> >> >> ludia1.3系や従来のコスト計算モードでも試したのですが、 >> >> 結果は同じでした。 >> >> >> >> 以上よろしくお願いします。 >> >> >> >> >> >> ----- Original Message ----- >> >> From: <kousa****@nttda*****> >> >> To: <ludia****@lists*****> >> >> Sent: Thursday, December 13, 2007 11:40 AM >> >> Subject: [Ludia-users 143] Re: 複数のテーブルに対する全文検索について >> >> >> >> >> >> > 幸坂です。こんにちは。 >> >> > >> >> > レコードが1行しかないため、シーケンシャルスキャンのほうが >> >> > 高速と判断されています。 >> >> > >> >> > ・レコード数を増やす。 >> >> > ・postgresql.conf にenable_seqscan = off と記述する。 >> >> > >> >> > などの方法を用いれば、インデックススキャンが利用されるはずです。 >> >> > >> >> >> -----Original Message----- >> >> >> From: ludia****@lists***** >> >> >> [mailto:ludia****@lists*****] On >> >> Behalf Of ssenou >> >> >> Sent: Thursday, December 13, 2007 11:27 AM >> >> >> To: ludia****@lists***** >> >> >> Subject: [Ludia-users 142]複数のテーブルに対する全文検索について >> >> >> >> >> >> 瀬能です。 >> >> >> お世話になっています。 >> >> >> >> >> >> 質問があるのですが、 >> >> >> 複数のテーブル(text型カラム)に対する複数の@@検索を実行すると >> >> >> 必ずシーケンシャルスキャンになってしまうのですが、 >> >> >> 複数のテーブル(text型カラム)に対する複数の@@検索は想定していない仕様 >> >> >> > で >> > す >> >> > か? >> >> >> (SQL文で対応出来ない事もないですが、できるだけ自由な記述をしたいと > 思っ >> > てい >> >> >> >> >> > るので…) >> >> >> また、回避方法などあれば教えてください。 >> >> >> >> >> >> 以上よろしくお願いします。 >> >> >> >> >> >> ■環境 >> >> >> Redhat Enterprise Linux 4 U5 >> >> >> ludia 1.4.0 (mecab-0.96 ipadic-2.7.0 senna-1.0.9 >> >> >> postgresql 8.2.4 >> >> >> >> >> >> ■設定 >> >> >> postgres.conf >> >> >> ・ludia.max_n_sort_result = 100000 >> >> >> ・ludia.enable_seqscan = off >> >> >> ・ludia_sen_index_flags = 31 >> >> >> ・ludia.max_n_index_cache = 16 >> >> >> ・ludia.initial_n_segments = 2048 >> >> >> ・ludia.usegenericcost = on or off共に >> >> >> >> >> >> ■DB >> >> >> ・table1(構成) : id(key) int4,data text >> >> >> ・table2(構成) : id(key) int4,data text >> >> >> ・table1(DATA) : id = 1,data = "TEST" >> >> >> ・table2(DATA) : id = 1,data = "TEST" >> >> >> ・table1(INDEX) : fulltextb >> >> >> ・table2(INDEX) : fulltextb >> >> >> >> >> >> ■現象 >> >> >> SELECT * FROM test1,test2 >> >> >> WHERE table1.data @@ 'TEST' or table2.data @@ 'TEST' >> >> >> >> >> >> と実行すると >> >> >> >> >> >> "Nested Loop (cost=0.00..2.04 rows=1 width=24)" >> >> >> " Join Filter: ((table1.data @@ 'TEST'::text) OR >> (table2.data @@ >> >> >> 'TEST'::text))" >> >> >> " -> Seq Scan on table1 (cost=0.00..1.01 rows=1 width=12)" >> >> >> " -> Seq Scan on table2 (cost=0.00..1.01 rows=1 width=12)" >> >> >> >> >> >> とシーケンシャルスキャンになってしまいます。 >> >> >> >> >> >> _______________________________________________ >> >> >> Ludia-users mailing list >> >> >> Ludia****@lists***** >> >> >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users >> >> >> >> >> > >> >> > _______________________________________________ >> >> > Ludia-users mailing list >> >> > Ludia****@lists***** >> >> > http://lists.sourceforge.jp/mailman/listinfo/ludia-users >> >> > >> >> > >> >> >> >> _______________________________________________ >> >> Ludia-users mailing list >> >> Ludia****@lists***** >> >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users >> >> >> > >> > _______________________________________________ >> > Ludia-users mailing list >> > Ludia****@lists***** >> > http://lists.sourceforge.jp/mailman/listinfo/ludia-users >> > >> > >> >> _______________________________________________ >> Ludia-users mailing list >> Ludia****@lists***** >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users >> > > _______________________________________________ > Ludia-users mailing list > Ludia****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/ludia-users > >