[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 メーリングリストの案内