Redshiftの設計で知っておかなければいけないこと
設計する前に下記ワードの意味をしっかりと知らないとRedshiftのテーブルを設計することはできません。各ワードについて設計の観点から説明したいと思います。
- ノードスライス
- 分散キー(DISTKEY)
- ソートキー(SORTKEY)
ノードスライス
ノードスライスとはノード数×CPUの数のことを指します。Redshiftはこのノードスライスごとにデータを格納し、各CPUが並列でデータ操作を行うことで超高速に大量のデータを処理することができています。
分散キー(DISTKEY)
分散キーとはノードスライスにデータを振り分けるときの基準となるカラムのことを指します。Redshiftは分散キーに指定された各レコードの値のハッシュ値を計算してハッシュ値ごとにノードスライスにデータを分散させています。分散キーはテーブルに対して1つしか設定できません。また分散の仕組みは、EVEN、KEY、ALLの3つがあります。
ソートキー(SORTKEY)
ソートキーとはデータの並び順を決めるときの基準となるカラムのことを指します。ソートキーには最大で400個までカラムを指定することができますが、MySQLのように複数のインデックスを貼るようなことはできません。MySQLでいうところの複合インデックスにカラムを400個指定できるだけです。なので、ソートキーの設定には慎重にならないといけません。
分散キーの選定
分散キーを設定するとき重要な項目が3つあります。それぞれの項目について説明します。
- 分散キーに指定するカラムの値は均一に分散しているか
- ノードスライスの数よりも値の種類が多いか
- 分散キーがWHERE句の1番最初に入っているか
分散キーに指定するカラムの値は均一に分散しているか
ここがまずはじめに一番大事です。分散キーに指定した値が偏っている場合、ノードスライスごとに処理するデータ量に偏りが出てしまい、早く処理が終わってしまうノードスライスがあったとしても、一番データ量の多いノードスライスの処理が終わるまで待ちが発生してしまいます。したがって、各ノードスライスの処理時間が均一になるように分散キーに指定するカラムは値が均一に分散している必要があります。
ノードスライスの数よりも値の種類が多いか
ノードスライス数よりも分散キーに指定した値の種類が少ない場合、データが割り振られないノードスライスができてしまい分散処理の機能をフルで使うことができません。例えばCPU数が4個でノード数が4のノードスライス16に対して月のようなカラムを分散キーに指定すると4つのノードスライスにデータが割り振られないことになります。なので分散キーには指定するカラムはノードスライスよりも多くなるようなカラムを指定しなければいけません。
分散キーがWHERE句の1番最初に入っているか
分散キーに指定したカラムをWHERE句の最初に指定している場合、データの入っているノードスライスが1つに確定されてしまいます。そのため他のノードスライスで処理する必要がなくなってしまい、分散処理を有効に活用することができません。したがって、WHERE句の最初に指定しないといけないようなカラムは分散キーには適していません。
ソートキーの選定
ソートキーの選定にも重要な項目が2つあります。
- ORDER BY, GROUP BYなどのソート処理で指定されるか
- WHERE句に指定してゾーンマップを有効にできるか
ORDER BY, GROUP BYなどのソート処理で指定されるか
ORDER BYやGROUPBYで使用するカラムをソートキーに指定している場合、クエリ実行時のソート処理を削減できるため実行時間を短くすることができます。
WHERE句に指定してゾーンマップを有効に活用できるか
Redshiftは1MBごとにデータブロックを作り、ソートキーに指定されたカラムの最小値と最大値をメタデータとして持つゾーンマップという仕組みがあります。ゾーンマップを使うことでデータのあるブロックをピンポイントに検索できるので処理を効率化することができます。
したがって、ソートキーをWHERE句の一番最初に指定すると高速で検索処理をすることができます。ソートキーにはCOMPOUND SORTKEYとINTERLEAVED SORTKEYという種類があり、ソートキーの指定順や、WHERE句の指定の仕方によってメリットデメリットがあるのでそれらも考慮する必要があります。ソートキーの種類についての説明はまた別で書きたいと思います。
まとめ
Redshiftの設計で特に気をつけるのは分散キーとソートキーの2つだけなのですが、関係してくる要素もなかなか多いので最初は理解するのが大変だと思います。しかし、この2つに関してしっかりと理解しておかないとテーブル設計は絶対できません。
またテーブル作成後に分散キーとソートキーを設定することができないのでなおさら設計段階でしっかりと考えておくことが必要になります。みなさんの設計の際の良い資料になれば幸いです。
参考資料
自分は下記資料で勉強させていただきました。1個目の資料のPDFを全て読めばRedshiftの設計で考えなければいけないことを深く知ることができます。さらっとでいいから知りたい人は2つ目の短い資料を読むといいかと思います。3つ目の資料はソートキーの種類について非常に分かりやすく書かれています。
Amazon Redshift テーブル設計詳細ガイド 分散スタイルとソートキーの決定方法
Redshiftテーブル設計前必見!!押さえておくべきRedshiftの分散処理の仕組みしくみ! 2014年09月01日
【新機能】Amazon Redshift の Interleaved Sorting機能を試してみた
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す