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