kousa****@nttda*****
kousa****@nttda*****
2007年 12月 13日 (木) 16:04:01 JST
幸坂です。 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 >