2011年4月15日

[mysql 15570] Re: Partition pruningについて。

田中です。

ご説明いただいた仕様にて、なぜ先頭のパーティションも
選択されれるのかを理解することが出来ました。

いただいた情報を基にインターネットをj検索した所、
海外のフォーラムにて、同じ内容がすでに議論されている事がわかりました。

Re: Partition Pruning
http://forums.mysql.com/read.php?106,386051,387925#msg-387925

奥野さんからご指摘いただいた通り、TO_DAYS()が単調写像ではなく
NULLを返す可能性があるため、NULLのデータが保存される
先頭のパーティションも選択されるとの事です。

対策としては、RANGE COLUMNSパーティショニングを使う事にしました。
この方法であれば、TO_DAYS()関数を使用しないので、
先頭のパーティションが選択されなくなりました。

○パーティションの設定方法
PARTITION BY RANGE COLUMNS(end_time_date) (
PARTITION p_2002_8_5 VALUES LESS THAN ('2002-8-12'),
PARTITION p_2002_8_12 VALUES LESS THAN ('2002-8-19'),
PARTITION p_2002_8_19 VALUES LESS THAN ('2002-8-26'),
 #中略
PARTITION p_2022_2_28 VALUES LESS THAN ('2022-3-7'),
PARTITION p_2022_3_7 VALUES LESS THAN ('2022-3-14'),
PARTITION p_maxvalue VALUES LESS THAN maxvalue
);

○Partition pruning動作確認

use development;

explain partitions

select
*
from
t1
where
end_time_date>= '2011-03-28' and
end_time_date< '2011-04-03' \G

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: p_2011_3_28
type: ALL
possible_keys: end_time_date_idx
key: NULL
key_len: NULL
ref: NULL
rows: 266901
Extra: Using where

※p_2011_3_28という本来検索の対象となるパーティションのみ選択されるようになりました。

これにて、無事問題が解決いたしました。
アドバイスありがとうございました。

田中宣親


(2011/04/14 16:43), Mikiya Okuno wrote:
> 奥野です。
>
> この挙動はMySQLの仕様です。
>
> MySQLのパーティショニングでは、評価式の結果がNULLになった場合、
> 先頭のパーティションにレコードが格納されます。
> TO_DAYS()はzero date(月や日が0の日付)などを入力すると
> NULLを出力するのですが、WHERE句の条件ではzero dateが含まれるかどうか
> までは分かりませんので、評価式の結果がNULLとなる可能性が否定できません。
> そのため、評価式の結果がNULLとなるレコードが格納されている先頭の
> パーティションもSELECTの対象になるのです。
>
> 対策として、先頭に空のパーティションを設定しておくことをおすすめいたします。
> (コマンドはALTER TABLE ... REORGANIZE PARTITION ...です。)
> VALUES LESS THANの値を極端に小さくしておけば、そのパーティションには
> レコードが含まれませんので、SELECTをしてもパフォーマンスの
> オーバーヘッドは生じません。
>
> ではでは。
> --
> 奥野 幹也
> http://www.google.com/profiles/mikiya.okuno
> http://nippondanji.blogspot.com/
> http://twitter.com/nippondanji
>
>
>
> On 04/14/2011 04:29 PM, Nobuchika.tanaka wrote:
>
>> 田中(たなか)と申します。
>>
>> パーティショニングをしたテーブルから、特定のパーティションにあるデータを
>> selectする際、
>> 特定のパーティション以外のパーティションも選択され困っております。
>> 特定のパーティションのみ選択され方法をご存知の方がいましたら、
>> アドバイスをお願いいたします。
>>
>> ○環境
>>  −MySQL:5.5.8
>>  −OS:Redhat5.5
>>
>> ○パーティションの設定方法
>>  −end_time_date(Date型のカラム)を基準に、1週間毎のデータのパーティショ
>> ンを1024個を設定。
>>
>> PARTITION BY RANGE (to_days(end_time_date)) (
>> PARTITION p_2002_8_5 VALUES LESS THAN (to_days('2002_8_12')),
>> PARTITION p_2002_8_12 VALUES LESS THAN (to_days('2002_8_19')),
>> PARTITION p_2002_8_19 VALUES LESS THAN (to_days('2002_8_26')),
>>  #中略
>> PARTITION p_2022_2_28 VALUES LESS THAN (to_days('2022_3_7')),
>> PARTITION p_2022_3_7 VALUES LESS THAN (to_days('2022_3_14')),
>> PARTITION p_maxvalue VALUES LESS THAN maxvalue
>> );
>>
>> ○Partition pruning動作確認
>>  −2011/03/28から2011/04/03の1週分のデータをselectする際に対象となる
>> パーティションを確認
>>
>> use development;
>>
>> explain partitions
>>
>> select
>> *
>> from
>> t1
>> where
>> end_time_date>= '2011-03-28' and
>> end_time_date< '2011-04-03' \G
>>
>> *************************** 1. row ***************************
>> id: 1
>> select_type: SIMPLE
>> table: t1
>> partitions: p_2002_8_5,p_2011_3_28
>> type: ALL
>> possible_keys: end_time_date_idx
>> key: NULL
>> key_len: NULL
>> ref: NULL
>> rows: 266901
>> Extra: Using where
>>
>> ※p_2002_8_5という本来検索の対象とならないパーティションが選択されています。
>>
>> ただし、where句の条件を範囲指定にしない場合、正しくパーティションが選択
>> されます。
>>
>> use development;
>>
>> explain partitions
>>
>> select
>> *
>> from
>> t1
>> where
>> end_time_date = '2011-04-01' \G
>>
>> *************************** 1. row ***************************
>> id: 1
>> select_type: SIMPLE
>> table: job
>> partitions: p_2011_3_28
>> type: ref
>> possible_keys: end_time_date_idx
>> key: end_time_date_idx
>> key_len: 3
>> ref: const
>> rows: 36421
>> Extra:
>>
>> ※p_2011_3_28という本来検索の対象となるパーティションのみ選択されます。
>>
>> 以上、よろしくお願いいたします。
>>
>> 田中宣親
>>
>>
>
>

投稿者 xml-rpc : 2011年4月15日 07:58
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103155
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。