クエリの例を使用して、vertica データベースの PROJECTION の概念を説明してもらえますか?
4 に答える
Vertica はインデックスを使用してデータを検索しません。
概念的には、引き続き SQL を使用してテーブルにアクセスします。ただし、内部では、テーブル内のデータはプロジェクションに格納されており、さまざまなクエリに対して最適化できます。
私はそれをトランプのデッキを表すテーブルと考えるのが好きです. ポーカーをプレイしている場合でも、次のように言うことができます
Select * from CardDeck limit 5;
次の列で定義されたテーブルがあるとします。
FaceValue int (let's just assume face values are ints),
Suit varchar(10)
次に、プロジェクションを作成します (パーティショニング、スーパー プロジェクション、バディ プロジェクションなどの詳細は省略します)。
create projection CardDeck_p1
(
FaceValue ENCODING RLE,
Suit
)
as
select FaceValue, Suit from CardDeck order by FaceValue;
create projection CardDeck_p2
(
FaceValue,
Suit
)
as
select FaceValue, Suit from CardDeck order by Suit;
現在、各列は、プロジェクションで定義されている異なるタイプのエンコーディングを取得できます。また、古いバージョンを使用していたのであまり使用していなかったデータベース デザイナーが、予測の設計を支援してくれます。
カードの類推に戻り、カードのデッキにアクセスしたいが、カードの異なるシャッフルが必要だと想像してください。Vertica のプロジェクションは、さまざまなシャッフルを提供します。テーブルは実際には、プロジェクションに格納されているデータにアクセスできるようにする構造です。ただし、SQL を作成している場合は、テーブルにアクセスします。
ジェフの答えで述べられている点を強調したいと思います-プロジェクションはディスク上の物理構造です。テーブルに複数のプロジェクションを定義すると、クエリのパフォーマンスが向上しますが、ディスク上のスペースが増え、読み込み時間が遅くなります (行を各プロジェクションに配置する必要があるため)。
すべての列をテーブルに格納するスーパープロジェクションと、部分プロジェクションがあります。サポート/最適化しようとしているクエリがテーブルの列のサブセットのみを必要とする場合は、部分射影を使用します。各テーブルには、少なくとも 1 つのスーパープロジェクションが必要です。定義しない場合、Vertica はデフォルトのものをプロビジョニングしますが、パフォーマンスが非常に低下する可能性があります。
データベース デザイナー ツールを使用して、テスト データとテスト クエリを使用してテーブルを分析することをお勧めします。その後、予測が提案されます。個人的には、この方法で素晴らしい結果が得られたわけではありませんが、DBD ツールの使用方法を知ることは、Vertica のトレーニングを受けるすべての人にとってカリキュラムの一部であるべきです。
Vertica ドキュメンテーションのConcepts Guide.pdf (23 ページあたり) から。
プロジェクションは、クエリの実行を最適化する形式でデータを格納します。クエリで使用されるたびに結果セットを計算するのではなく、結果セットをディスクに格納するという点でマテリアライズド ビューに似ています。
また
プロジェクションは、SQL のエンド ユーザーに対して透過的です。Vertica クエリ オプティマイザーは、任意のクエリに使用する最適な予測を自動的に選択します。
プロジェクションでクエリのパフォーマンスを向上させるために必要なことは、プロジェクションを作成することだけです。Vertica は、そのクエリに使用する最適なプロジェクションを自動的に選択します。(注: テーブルの代わりに特定のプロジェクションに対してクエリを実行することで、特定のプロジェクションを強制することができます)
プロジェクションについてのあなたの理解がどこにあるのかわかりませんが、プロジェクションについてより具体的な質問をすることで、特定の点についてより詳しく説明できるようになります。概念の全体像を知りたい場合は、Concepts Guide.pdfを入手して読むことをお勧めします。http://my.vertica.com