[前][次][番号順一覧][スレッド一覧]

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]