以下のようなクエリーを作成して検索を
行っているのですが、どうしても抽出が出来ないくらい
遅くどの部分で遅くしているのかが分からないため、
どなたか教えてもらえないでしょうか?
※足りない情報があればすみませんが、仰ってください。
なるべくプログラム(PHP等)を使わずクエリのみで
行いたいので、PHP云々の話しは無しでお願い致します。
最初の抽出テーブル(osi)と次の抽出テーブル(osday)
をそれぞれ個別で動かすと普通の速度で抽出が旨く行きます
が、それらをくっつけた形
select (省略) from osi,osday where osi.id=osday.id;
とすると、抽出が行えない又は非常に遅いとなります。
///////// 実際のクエリー文です /////////
select osday.odid,odctmid,saitemname,startday,endday from
(
select
odid,saitemname
from order1 as o,sale as s
where o.odid=s.saorderid
and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59')
and (o.odcancelflag='0' or o.odcancelflag is null)
and o.odclass<'4' and s.saregular='1'
and s.saitemcode in (select itcode from item where itcategory='1')
and odmakeday is not null
) osi
,
(
select
odid,max(odctmid) as odctmid,to_char(min(o.odshipday), 'YYYY-MM-DD') as startday,to_char(max(o.odshipday), 'YYYY-MM-DD') as endday
from order1 as o,sale as s
where o.odid=s.saorderid
and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59')
and (o.odcancelflag='0' or o.odcancelflag is null)
and o.odclass<'4' and s.saregular='1'
and s.saitemcode in (select itcode from item where itcategory='1')
and odmakeday is not null group by o.odid
) osday
where osi.odid=osday.odid;
///////////////////////////////////////////
No.1ベストアンサー
- 回答日時:
とりあえずpostgreSQLでしたら発行するSQL文の頭にexplainを付けて、QUERY COSTを確認してみてはいかがでしょうか?
cost=の数字が極端に大きくなるところが律速です。
この回答への補足
以下が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)
すみません何とか解決をしました。
odidにdistinct on (odid)とすると普通に
抽出できるようになりました。
ありがとう御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「A,B組の女子の氏名のよみ。 1 2023/05/16 15:28
- 英語 英文の添削をお願いします 4 2023/05/23 11:10
- 大学受験 英作文の添削をお願いしたいです。 2 2022/08/19 20:37
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- 英語 できるだけ直訳で英語の翻訳をお願いします。(英語→日本語) 1 2022/10/15 20:59
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
postgresql についてです
-
plgファイルの開き方
-
postgreSQLのint型は桁数指定が...
-
bashスクリプトでpostgreSQLの...
-
エクセルで縦のカラムデータを...
-
自治会総会の成立要件について
-
Ophcrackについて
-
terapad 1行文字数変更が反映...
-
列が存在しないと言われる
-
SQLにて指定日付より前、かつ最...
-
shellからpostgresqlへの変数の...
-
Windows10でQuickTimeがインス...
-
SQLで、あるグループの集計を行...
-
select文の書き方「半角カナ+...
-
Postgreのupdateコマンドでエラー
-
PostgreSqlでFunctionの作成に...
-
【Minecraft】GL ERROR
-
新規作成したPostgresqlデータ...
-
postgresqlでのトランザクショ...
-
sqlの中で、 例えば条件句で AN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessの表結合SQL
-
重複した複数データを一つのレ...
-
抽出が出来ないくらい遅いクエリ
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルの値をテキス...
-
Oracle 2つのDate型の値の差を...
-
セルの右クリックで出る項目を...
-
Access テキスト型に対する指定...
-
作番ってどういう意味でしょうか?
-
Accessでコードを入れると名前...
-
Accessのフィールド数が255しか...
-
Accessのリンクテーブルのパス...
-
テーブルの存在チェックについて
-
ACCESSのクエリで集計で、先頭...
-
ACCESSで400以上のフィールドが...
-
変数が選択リストにありません
-
SUBSTRING 関数に渡した長さの...
おすすめ情報