mysql:15754
From: ram <ram <ram@xxxxxxxxxx>>
Date: Mon, 23 Apr 2012 19:53:20 +0900
Subject: [mysql 15754] Re: 行列変換を行う処理を高速化するには?
後藤様 コメント有難うございました。 年月を分割して、別の列にする方法は 以下のように一時テーブルを使う方法と、テスト環境を作って、 テーブルの最後に列を追加して試してみましたが、 処理時間はほとんど変わりませんでした。 SELECT x.nm, sum(case when x.dd = '01' then 1 else 0 end) as 'h101', sum(case when x.dd = '02' then 1 else 0 end) as 'h102', (中略) sum(case when x.dd = '31' then 1 else 0 end) as 'h131' FROM (SELECT nm,Mid(CAST(npdt AS CHAR),7,2) as dd FROM nippo WHERE sycd = #ck_sycd# and npdate>= #from_ymd# and npdate< #to_ymd# ) as x GROUP BY x.nm ORDER BY x.nm しかし、WHERE条件を簡略化するのと、インデックスを貼り直すのは行っており ませんでした ので、再度試してみました。 ALTER TABLE nippo ADD yymm char(4); ALTER TABLE nippo ADD dd char(2); UPDATE nippo SET yymm = Mid(CAST(npdt AS CHAR),1,6); UPDATE nippo SET dd = Mid(CAST(npdt AS CHAR),7,2); CREATE INDEX idx1 ON nippo(sycd,yymm,nm); SELECT nm, sum(case when dd = '01' then 1 else 0 end) as 'h101', sum(case when dd = '02' then 1 else 0 end) as 'h102', (中略) sum(case when dd = '31' then 1 else 0 end) as 'h131' FROM nippo WHERE sycd = #ck_sycd# and yymm = #yymm# GROUP BY nm ORDER BY nm; というような感じです。件数を絞ったテスト環境で試してみましたが、 実行結果はほとんど変わりません。 若干ですが、遅くなったような数値が出ます。 アドバイス感謝致します。 -------------------------------------- 初穂 太郎 (2012/04/23 14:17), gotou1213@xxxxxxxxxx wrote: > 後藤と申します。 > >> 件数が多くなると、検索時間が掛かるようになってきたため、 >> 日付のうち、日(1-31)を表す部分を別の列(npdt_d)にして > テーブル定義の変更が許されるのであれば npdt を、年・月・日に分割し、 > (例えば npdt_y, npdt_m, npdt_d)、以下のようなインデックスを作成し、 > > CREATE INDEX idx2 on nippo ( sycd, npdt_y, npdt_m, nm ); > > 以下のように検索することで改善されないでしょうか? > (月指定での集計しか出来ませんが) > > SELECT nm, > sum(case when npdt_d=01 then 1 else 0 end) as 'h101', > sum(case when npdt_d=02 then 1 else 0 end) as 'h102', > : > sum(case when npdt_d=30 then 1 else 0 end) as 'h130', > sum(case when npdt_d=31 then 1 else 0 end) as 'h131' > FROM nippo > WHERE sycd = #sycd# AND npdt_y = #npdt_y# AND npdt_m = #npdt_m# > GROUP BY nm > ORDER BY nm > > npdt_y と npdt_m を別列にすることで、検索方法が range では無く ref になるようにして、 > GROUP BY や ORDER BY をソートでは無くINDEX順の走査だけにする、というイメージです。 > なので、年月日に分割しなくても、npdt_ym のように年月の列だけ設けて > > CREATE INDEX idx2 on nippo ( sycd, npdt_ym, nm ); > > でも大体同じです。 > >
15742 2012-04-20 09:36 [ram <ram@xxxxxxxxxx>] 行列変換を行う処理を高速化するには? 15743 2012-04-20 11:12 ┣[中川 貴 <takashi.nak] 15744 2012-04-20 13:58 ┃┗[ram <ram@xxxxxxxxxx>] 15745 2012-04-20 15:24 ┃ ┗[中川 貴 <takashi.nak] 15747 2012-04-20 17:58 ┃ ┗[ram <ram@xxxxxxxxxx>] 15748 2012-04-20 22:05 ┃ ┣[Tsubasa Tanaka <yoku] 15749 2012-04-21 01:06 ┃ ┃┗[Tsubasa Tanaka <yoku] 15750 2012-04-21 02:05 ┃ ┃ ┗[Tsubasa Tanaka <yoku] 15753 2012-04-23 15:39 ┃ ┃ ┗[ram <ram@xxxxxxxxxx>] 15756 2012-04-25 14:54 ┃ ┗[中川 貴 <takashi.nak] 15758 2012-04-25 16:34 ┃ ┗[ram <ram@xxxxxxxxxx>] 15759 2012-04-25 17:09 ┃ ┗[中川 貴 <takashi.nak] 15760 2012-04-25 17:18 ┃ ┗[Tomohiro 'Tomo-p' KA] 15761 2012-04-25 18:25 ┃ ┗[中川 貴 <takashi.nak] 15762 2012-04-25 19:05 ┃ ┗[Tomohiro 'Tomo-p' KA] 15752 2012-04-23 14:17 ┗[<gotou1213@xxxxxxxxx] -> 15754 2012-04-23 19:53 ┗[ram <ram@xxxxxxxxxx>] 15755 2012-04-24 13:50 ┗[<gotou1213@xxxxxxxxx] 15757 2012-04-25 15:39 ┗[ram <ram@xxxxxxxxxx>] 15765 2012-04-26 14:12 ┗[<gotou1213@xxxxxxxxx]