kousa****@nttda*****
kousa****@nttda*****
2007年 12月 13日 (木) 17:29:59 JST
幸坂です。 このクエリで、いかがでしょうか? select * from (select * from table1 where data @@ 'test') AS t1, (select * from table2 where data @@ 'test') AS t2 WHERE t1.id = t2.id; 速度だけを考えるならば、 table1とtable2を結合したテーブルを定義し、 マルチカラムインデックス(もしくは配列型インデックス)を張ると、 高速になります。 > -----Original Message----- > From: ludia****@lists***** > [mailto:ludia****@lists*****] On Behalf Of ssenou > Sent: Thursday, December 13, 2007 5:04 PM > To: ludia****@lists***** > Subject: [Ludia-users 148] Re:複数のテーブルに対する全文検索について > > 瀬能です。 > すいません、括弧をつけ忘れていました。 > 正しくは下記です。 > > 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-lex > ical.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 > > > > > > _______________________________________________ > Ludia-users mailing list > Ludia****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/ludia-users >