[pgsql-jp: 35698] Re: たくさんの表を連結するときの速いSQL文を教えてください

"鈴木孝征(Suzuki Takamasa)" takamasa @ thaliana.myhome.cx
2005年 7月 7日 (木) 20:09:03 JST


鈴木孝征です。

お返事ありがとうございます。教えていただいたことを参考にいろいろ試してい
ます。結論には至っていませんが、こんなことを試しているということが伝われ
ばと思い書きます。

何かお気づきの点があれば教えてください。

>  主題からは外れるのですが、特別な事情が無ければ複数のテーブルに
> 分けないのが一番シンプルで早い解決方法です。
> 
> create table tany (
>  t int,
>  p text,
>  v double
> );
> 
>  tには1〜1400,pに1〜21500,vに各値が入るイメージでしょうか。
>  これであれば簡単なselect文だけで検索できます。

以前このようなテーブルを作成して試したことがあります。データの数が
1400x21500 = 約3000万となり、検索やデータの更新にとても時間がかかりまし
た。またt1とt2のvを比較すること(select t1.v/t2.v from t1, t2 where t1.p
= t2.pといった計算)もあるのでt1からt1400のテーブルにわけました。

> 以下の様にunionでつなぐかだと思います。
> 
> select 1,v from t1 where p in ('p1',....)
> union
> select 2,v from t2 where p in ('p1',....)

unionでつなぐ方法を試してみました。私の考えたSQLを分割し、一時テーブルを
作成する方法とそれほど検索時間はかわりませんでした(若干unionのほうが遅い
ですが)。私の調べた限りではこの方法の場合、検索時間は選択したテーブルの
数にほぼ比例していて、私の方法より微調整がない点が優れていました。しかし
検索後、表にして(横にp1,...縦にt1,...)表示したいのでPHPで多少データを加
工しないといけない点が私の目的には合いませんでした。

>  尤もこの前者の方法は同時1アクセスが保証されていないと使えませんけど。。

一時テーブルを作成しないように下記のように変更したところ余計に時間がか
かったり、メモリが足りなくなってしまいました。

SQL1:	select t1.p as p, t1.v as t1, t2.v as t2, ... , t10.v as t10
	into s1
	from t1, t2, ... , t10
	where (t2.p = t1.p and ... and t10.p = t1.p) and
	      t1 in (p1, p2, ..., p100)

SQL2:	select t11.p as p, t11.v as t11, t12.v as t12, ... , t20.v as t20
	into s2
	from t11, t12, ... , t20
	where (t12.p = t11.p and ... and t20.p = t11.p) and
	      t11 in (p1, p2, ..., p100)

SQL3 からSQL10までを作成

select s1.p as p, t1, t2, t3 , ... t100
from (SQL1) as s1, (SQL2) as s2, ... , (SQL10) as s10
where s2.p = s1.p and s3.p = s1.p and ... and s10.p = s1.p

同時アクセスのことを考え一時テーブルの名前をランダムにするようにして対処
することにしました。



pgsql-jp メーリングリストの案内