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

mysql:8916

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Sun, 07 Mar 2004 13:36:10 +0900
Subject: [mysql 08916] Re: DISTINCT オプションの動作について

 こんにちは。

<konet218@xxxxxxxxxx>さんの
<002001c403c1$47be45c0$0a00a8c0@Kondou>
"[mysql 08915] Re: DISTINCT オプションの動作について"


> MESSAGE中に“|”があると不具合が出そうで私の技量では危険な匂いがプンプンなので
> 今回はやめておきます。・・・が、こんなオプションがあるんですね〜。
> 他の所で使えそうなのでマニュアル確認してみます。ありがとう御座います。

 セパレータ文字は、問題が起きそうにない文字で結構です。“|”を使ったの
は単なる例です。


> [mysql 08909]は、まったく気にしておりませんでした。
> ざっと目を通しましたが・・・結構理解するのに時間かかりそう^^;

 [mysql 08913]で宇野さんが述べておられる「集合関数とテンポラリテーブル
を使う」が同じ方法です。


> ◆宇野さん
> > ・自己ジョインを使う
> >   SELECT a.* FROM tbl AS a LEFT JOIN tbl AS b
> >    ON a.NO=b.NO AND a.DATE < b.DATE WHERE b.NO IS NULL;
> 
> やられた〜って気分です。
> こうゆう使い方もあるんですね。
> 勉強になります。
> 
> 今回は、宇野さんに教えて頂いたSQLを参考に進めて行こうと思います。
> これだったら重複数も楽に取得出来ますし、分かりやすいですから^^

 自己ジョインは、テーブルのレコード数が少ない場合には OKなのですが、処
理が遅い問題があります。一般的には、レコード数をNとすると処理時間はNの
二乗に比例します。つまり、あるレコード数の場合に処理時間が1秒であるなら
ば、その10倍のレコード数では100(10^2)秒の処理時間になります。

 cpu:P3-1GHz-dual、mem:768MBなWindows2000マシン上の4.0.15-maxで試してみ
ました。「create table tmp001 (NO int,MESSAGE varchar(50),DATE
datetime);」なテーブルに対するレコード数と

    SELECT a.* FROM tmp001 AS a LEFT JOIN tmp001 AS b ON a.NO=b.NO 
      AND a.DATE < b.DATE WHERE b.NO IS NULL;

のクエリの実行時間とを計測した結果が下の表です。ほぼレコード数の二乗で処
理時間が増加している事が分かると思います。

    recs |  sec
    -----+------
     100 |  0.02
    1000 |  1.14
    2000 |  4.59
    3000 | 10.31
    4000 | 18.34
    5000 | 28.78


 ちなみに、結合文字列を使う方法の

    select NO,max(concat(DATE,'|',MESSAGE)) FROM tmp001 group by NO;

の場合は、以下に見られる様に処理時間はレコード数に比例するだけです。一時
テーブルを使用する方法も、処理時間はレコード数に対し単調増加となるでしょ
う。

      recs |  sec
    -------+------
       100 | 0.00
      1000 | 0.00
      2000 | 0.00
      3000 | 0.01
      4000 | 0.01
      5000 | 0.03
    -------+------
     10000 | 0.03
    100000 | 0.38


 今回の近藤さんのケースではテーブルのレコード数の明記が無いため、自己ジ
ョインでも問題が無いレコード数なのかもしれません。ですが、自己ジョイン
(に限らず、サブクエリでも自己結合的なものが存在するもの) は「論理的には
正しいが、処理時間が現実的ではない」となるレコード数が、かなり小さな値と
なる (場合がある、というか非常に多い)事に注意が必要です。



    松枝知直    <tomom@xxxxxxxxxx>
            http://www.argus.ne.jp/~tomom/



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

      8911 2004-03-07 02:49 [<konet218@xxxxxxxxxx] DISTINCT オプションの動作について       
      8912 2004-03-07 03:52 ┣[ML account <ml@xxxxx]                                       
      8918 2004-03-07 16:51 ┃┗[KAWAJI Shinya <kawaj]                                     
      8920 2004-03-07 22:06 ┃ ┗[ML account <ml@xxxxx]                                   
      8913 2004-03-07 04:48 ┗[UNO Shintaro <uno@xx]                                       
      8914 2004-03-07 06:20  ┣[Sumito_Oda <oda@xxxx] 予約語 (Re: DISTINCT オプションの動作について)
      8915 2004-03-07 06:23  ┗[<konet218@xxxxxxxxxx]                                     
->    8916 2004-03-07 13:36   ┗[ML account <ml@xxxxx]                                   
      8919 2004-03-07 18:56    ┗[UNO Shintaro <uno@xx]                                 
      8921 2004-03-07 22:06     ┗[ML account <ml@xxxxx]                               
      8923 2004-03-07 22:29      ┗[UNO Shintaro <uno@xx]