[pgsql-jp: 36931] Re: 項目毎に件数指定をしたい

Yasuhiro Shibutani yasuhiro_shibutani @ ybb.ne.jp
2006年 3月 27日 (月) 18:11:34 JST


渋谷です。

本質的な部分ではないですが、
私が BETWEEN 演算子の動作を勘違いしていたため、
(_t1 > _t2) のとき書いたつもりには動作しませんね。。。

On Sun, 26 Mar 2006 20:41:17 +0900
Yasuhiro Shibutani <yasuhiro_shibutani @ ybb.ne.jp> wrote:

> 渋谷です。
> 
> > > "ID" が一意なテーブルはないんでしょうか?
> > > あるならそちらのテーブルにクエリかけた方がいいです。
> > > ないなら作ったほうがいいです。^^;
> > ここで質問させて頂いた"ID"ですが、実際のテーブルでは
> > 日付(yyyy/mm/dd)を to_char( hiduke ,'yyyy/mm')としているので
> > これもコストがかかっているせいなんでしょうね。
> > #実は今まで、こういうコスト意識していませんでした
> 
> なるほど、これは想像つきませんでした。
> 
> しかし、これなら例え10年分出力する場合であっても
> 120回しか内側のクエリを実行しないことになりますね。
> 
> 例えば次のような感じではダメでしょうか。
> 
> 
> CREATE OR REPLACE FUNCTION "public"."rank_table1_f1" (
>   "_t1" timestamptz,
>   "_t2" timestamptz,
>   "_top_n" integer
> ) RETURNS SETOF "public"."table1" AS
> $body$
> DECLARE
>   "_t" timestamptz;
>   "_ret" "table1"%ROWTYPE;
> BEGIN
> 
>   "_t" := date_trunc('month', "_t1");
> 
>   WHILE (
>     "_t" BETWEEN
>     date_trunc('month', "_t1") AND
>     date_trunc('month', "_t2")
>   ) LOOP
> 
>     FOR "_ret" IN
>       SELECT * FROM "table1"
>       WHERE "hiduke" = "_t"
>       ORDER BY "f1" DESC
>       LIMIT "_top_n"
>     LOOP
>       RETURN NEXT "_ret";
>     END LOOP;
> 
>     IF ("_t1" < "_t2") THEN
>       "_t" := "_t" + interval '1 month';
>     ELSE
>       "_t" := "_t" - interval '1 month';
>     END IF;
> 
>   END LOOP;
> 
>   RETURN;
> 
> END;
> $body$
> LANGUAGE 'plpgsql'
> STABLE CALLED ON NULL INPUT
> SECURITY INVOKER;
> 
> 
> 内側のクエリの無駄打ちが発生するかもしれませんが、
> インデックスが張ってあればコストは大してかかりません。
> (少なくとも以前のものよりは低コストだと思います。)
> 
> hiduke フィールドに「式に対するインデックス」があれば
> なお良いですね。
> 
> 
> On Sat, 25 Mar 2006 14:59:12 +0900
> 西村 篤史 <a2c @ lets-heart.co.jp> wrote:
> 
> > 西村@和歌山市です。
> > 
> > Yasuhiro Shibutani wrote:
> > > 渋谷です。
> > > # もういいのかもしれませんが。。。
> > いえいえ、ありがとうございます(^^
> > 
> > >>渋谷さんのを実行してみますと、項目ごとに30行表示で44.7秒と
> > > 実際のテーブル定義やデータが分からないのでハッキリとはいえませんが、
> > > まだまだ遅いと思いますね。
> > 
> > お、遅いですか(苦笑
> > 
> > > "ID" が一意なテーブルはないんでしょうか?
> > > あるならそちらのテーブルにクエリかけた方がいいです。
> > > ないなら作ったほうがいいです。^^;
> > ここで質問させて頂いた"ID"ですが、実際のテーブルでは
> > 日付(yyyy/mm/dd)を to_char( hiduke ,'yyyy/mm')としているので
> > これもコストがかかっているせいなんでしょうね。
> > #実は今まで、こういうコスト意識していませんでした
> > 
> > 
> > > 浅見です。
> > > PostgreSQL 8.0からは、sort_memではなくwork_memを利用するのが
> > > 一般的です。(7.xでsort_memだったものが8.0でwork_memに名前が変
> > > わりました)
> > そういう事だったんですね。早速やってみました。
> > 本では目にしていた「コスト」ですが、考えさせられる一件でした。
> > 
> > 渋谷さん、浅見さん、ありがとうございました。
> 
> -- 
> Yasuhiro Shibutani <yasuhiro_shibutani @ ybb.ne.jp>

-- 
Yasuhiro Shibutani <yasuhiro_shibutani @ ybb.ne.jp>




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