• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:抽出が出来ないくらい遅いクエリ)

抽出が出来ないくらい遅いクエリ

このQ&Aのポイント
  • クエリの速度が非常に遅く、抽出ができない問題について
  • osdayテーブルとosiテーブルを結合したクエリの速度が遅い
  • クエリの最適化を行いたいが、どの部分が遅いのかが分からない

質問者が選んだベストアンサー

  • ベストアンサー
  • miya_0726
  • ベストアンサー率54% (94/173)
回答No.1

とりあえずpostgreSQLでしたら発行するSQL文の頭にexplainを付けて、QUERY COSTを確認してみてはいかがでしょうか? cost=の数字が極端に大きくなるところが律速です。

unhork
質問者

お礼

すみません何とか解決をしました。 odidにdistinct on (odid)とすると普通に 抽出できるようになりました。 ありがとう御座いました。

unhork
質問者

補足

以下がexplainを行った結果になります。 どうも”ソート”で非常に時間がかかっている事は 分かるのですが、どこをどう変更を行うと 早くする事が可能なのかが分かりませんので、 申し訳ないのですが、お教え願いますでしょうか? Merge Join (cost=3540286937523.30..7081061083958.06 rows=40538736678 width=185) Merge Cond: ("outer".odid = "inner".odid) -> Nested Loop (cost=0.00..3540266237821.62 rows=389823931 width=109) Join Filter: ((("outer".odcancelflag = 0) AND ("outer".odid = "inner".saorderid) AND ("outer".odshipdue >= '2007-12-01 00:00:00+09'::timestamp with time zone) AND ("outer".odshipdue <= '2007-12-18 23:59:59+09'::timestamp with time zone) AND ("outer".odclass < 4::bigint)) OR (("outer".odcancelflag IS NULL) AND ("outer".odid = "inner".saorderid) AND ("outer".odshipdue >= '2007-12-01 00:00:00+09'::timestamp with time zone) AND ("outer".odshipdue <= '2007-12-18 23:59:59+09'::timestamp with time zone) AND ("outer".odclass < 4::bigint)) OR (("inner".saregular = '1'::character varying) AND (subplan) AND ("outer".odmakeday IS NOT NULL))) -> Index Scan using order1_pkey on order1 o (cost=0.00..1444665.32 rows=374858 width=32) -> Seq Scan on sale s (cost=0.00..11803.60 rows=418060 width=77) SubPlan -> Materialize (cost=22.50..22.55 rows=5 width=32) -> Seq Scan on item (cost=0.00..22.50 rows=5 width=32) Filter: (itcategory = 1::bigint) -> Sort (cost=3540289316823.30..3540289414279.28 rows=38982393 width=93) Sort Key: osday.odid -> Subquery Scan osday (cost=0.00..3540270136060.93 rows=38982393 width=93) -> Aggregate (cost=0.00..3540270136060.93 rows=38982393 width=93) -> Group (cost=0.00..3540267212381.45 rows=389823931 width=93) -> Nested Loop (cost=0.00..3540266237821.62 rows=389823931 width=93) Join Filter: ((("outer".odcancelflag = 0) AND ("outer".odid = "inner".saorderid) AND ("outer".odshipdue >= '2007-12-01 00:00:00+09'::timestamp with time zone) AND ("outer".odshipdue <= '2007-12-18 23:59:59+09'::timestamp with time zone) AND ("outer".odclass < 4::bigint)) OR (("outer".odcancelflag IS NULL) AND ("outer".odid = "inner".saorderid) AND ("outer".odshipdue >= '2007-12-01 00:00:00+09'::timestamp with time zone) AND ("outer".odshipdue <= '2007-12-18 23:59:59+09'::timestamp with time zone) AND ("outer".odclass < 4::bigint)) OR (("inner".saregular = '1'::character varying) AND (subplan) AND ("outer".odmakeday IS NOT NULL))) -> Index Scan using order1_pkey on order1 o (cost=0.00..1444665.32 rows=374858 width=48) -> Seq Scan on sale s (cost=0.00..11803.60 rows=418060 width=45) SubPlan -> Materialize (cost=22.50..22.55 rows=5 width=32) -> Seq Scan on item (cost=0.00..22.50 rows=5 width=32) Filter: (itcategory = 1::bigint)