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

mysql:8919

From: UNO Shintaro <UNO Shintaro <uno@xxxxxxxxxx>>
Date: Sun, 07 Mar 2004 18:56:16 +0900
Subject: [mysql 08919] Re: DISTINCT オプションの動作について

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

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

実行時間についての考察と補足をありがとうございます。

松枝さんへ

なるほど、自己ジョインに限らず普通のジョインでも「適切なインデックスが
なければ」直積のロー全件アクセスが起きてしまいますね。
使われるクエリーパターンに応じて適切なインデックスをつけるのは当たり前
だと思っていたのですが、それでは答えとしては足りないということですね。
すみませんでした。

近藤さんへ

今回の場合、自己ジョインの方法と、一時テーブルを使う方法では、その点に
気をつけて適切なインデックスを付けるなどの対処が要ります。その対処で、
松枝さんが示して下さっている最悪ケース(インデックスなしの状態)よりは
だいぶ速度が改善できます。
その上で、もう一つ実行時間に関係する因子があります。NOの重複度合いです。
アバウトに言うと、
・NOの重複が少ないとき
 GROUP BYのロー数が増えるので、結合文字列の方法と一時テーブルの方法が
 遅くなる傾向がある(GROUP BYの結果生成コストがロー数の二乗に近づく)
・NOの重複が多いとき
 LEFT JOINのロー数が増えるので、自己ジョインの方法は遅くなる傾向があ
 る(LEFT JOINの結果生成コストがロー数の二乗に近づく)
という感じになります。

それにしても、松枝さんが書いて下さっている結合文字列を使う方法はうまい
ですね。桁数をきちんと揃えるとかの考慮は要るものの、その条件を満たせば
有効な方法だと思います。

以上、ありがとうございました。

-- 
UNO Shintaro, 宇野 信太郎
mailto:uno@xxxxxxxxxx
http://www.venus.dti.ne.jp/~uno/

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

      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]