Tableスキーマ設計の最適化
概要
Schema設計とチューニングにおいて、TableSchema設計は重要な部分であり、Tableエンジン選択、パーティションとバケットカラム選択、パーティションとバケットサイズ設定、キーカラムとフィールドタイプ最適化などを含みます。適切なSchema設計が不足しているシステムでは、データスキュー、システム並列性とソート機能を十分に活用できないなどの問題が発生し、ビジネスシステム内でDorisシステムが真の性能上の優位性を実現することを妨げる可能性があります。
詳細な設計原則はData Table Designセクションで確認できます。この章では、実践的なケースの観点から、いくつかの典型的なシナリオにおけるSchema設計の問題によって引き起こされる性能ボトルネックを紹介し、ビジネスチューニングの参考として最適化の提案を提供します。
Case 1: Tableエンジン選択
DorisはDuplicate、Unique、Aggregateの3つのTableモデルをサポートしています。その中で、UniqueはMerge-On-Read(MOR)とMerge-On-Write(MOW)にさらに分けることができます。
これらのTableモデルのクエリ性能は、優れた順から:Duplicate > MOW > MOR == Aggregateとなります。そのため、通常の状況では、特別な要件がない場合は、より良いクエリ性能のためにDuplicateTableを推奨します。
ビジネスにデータ更新要件がなく、クエリ性能に対する要求が高い場合は、Duplicate tableを推奨します。
Case 2: バケットカラム選択
Dorisはデータのバケッティングをサポートしており、これはSchema内のバケットキーに基づいてデータを分散し、データバケットを形成することを意味します。
適切なバケットカラムを選択することは、生データの合理的な分散にとって重要であり、データスキューによって引き起こされる性能問題を効果的に防止します。同時に、DorisのColocate JoinとBucket Shuffle Join機能の利用を最大化し、Join操作の性能を大幅に向上させます。
Tablet1のTable作成文を例として、現在のバケットカラムはc2として設定されています。しかし、実際のデータインポートプロセス中に、カラムc2のすべての値がnullにデフォルト設定されている場合、64個のバケットが設定されていても、1つのバケットのみがすべてのデータを含むことになります。この極端なケースは深刻なデータスキューを引き起こし、性能ボトルネックをもたらします。
CREATE TABLE `t1` (
`c1` INT NULL,
`c2` INT NULL
) ENGINE=OLAP
DUPLICATE KEY(`c1`)
DISTRIBUTED BY HASH(`c2`) BUCKETS 64
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
insert into t1 select number, null from numbers ('number'='10000000');
上記の状況に対応するため、bucketカラムをc2からc1に変更することで、適切なデータハッシュを実現し、システムの並列処理能力を最大化して、チューニング目的を達成できます。
したがって、Schema設計フェーズでは、業務担当者がビジネス特性に基づいて事前に適切なbucketカラムを設計する必要があります。例えば、カラムc2のビジネス意味がnullや特定の値など、大量の偏った値を含む可能性があることが事前に分かっている場合、これらのフィールドはbucketカラムとして避けるべきです。逆に、user IDなど、ビジネス意味において適切なハッシュ特性を持つフィールドをbucketカラムとして選択すべきです。パフォーマンス問題のトラブルシューティングフェーズでは、以下のSQL文を使用してbucketフィールドにデータスキューがあるかを確認し、それに応じて後続の最適化調整を行うことができます。
select c2,count(*) cnt from t1 group by c2 order by cnt desc limit 10;
bucket列にデータの偏りの問題があるかどうかを確認してください。偏りがある場合は、ビジネス上の意味において十分なハッシュ特性を持つフィールドをbucket列として置き換えてください。
良好な事前設計により、問題が発生した際の特定と修正のコストを大幅に削減できることは明らかです。したがって、不要なコストの発生を避けるため、Schema設計フェーズにおいてビジネス担当者が厳密な設計と確認を行うことを強く推奨します。
ケース3:Key列の最適化
3つのTableモデルのうち、Table作成のSchemaでDuplicate Key、Unique Key、またはAggregate Keyを明示的に指定した場合、Dorisはストレージレベルでkey列に基づいてデータがソートされることを保証します。この機能は、データクエリのパフォーマンス最適化に新しいアイデアを提供します。具体的には、Schema設計フェーズにおいて、ビジネスクエリで等価検索や範囲検索に頻繁に使用される列をkey列として定義することで、このようなクエリの実行速度を大幅に向上させ、全体的なパフォーマンスを向上させることができます。
以下は、ビジネスクエリ要件の例です:
select * from t1 where t1.c1 = 1;
select * from t1 where t1.c1 > 1 and t1.c1 < 10;
select * from t1 where t1.c1 in (1, 2, 3);
上記のビジネス要件とSchemaデザイン、およびTablet1の後続最適化について、クエリプロセスを高速化するためにカラムc1をKeyカラムとして設定することを検討することが推奨されます。以下に例を示します:
CREATE TABLE `t1` (
`c1` INT NULL,
`c2` INT NULL
) ENGINE=OLAP
DUPLICATE KEY(`c1`)
DISTRIBUTED BY HASH(`c2`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
ビジネスクエリで頻繁に使用されるカラムをキーカラムに設定して、クエリプロセスを高速化します。
ケース4: フィールドタイプ最適化
データベースシステムでは、異なるタイプのデータを処理する複雑さは大きく異なる場合があります。例えば、可変長タイプの処理は固定長タイプよりもはるかに複雑です。同様に、高精度タイプの処理は低精度タイプよりも複雑です。
この特性は、ビジネスシステムSchemaの設計と後の最適化において重要な洞察を提供します:
- ビジネスシステムの表現と計算のニーズを満たしながら、固定長タイプを優先し、可変長タイプの使用を避けるべきです;
- 同時に、高精度タイプの代わりに低精度タイプを採用すべきです。具体的な実践には、VARCHARやSTRINGタイプフィールドをBIGINTに置き換えること、DECIMALタイプフィールドをFLOAT / INT / BIGINTに置き換えることが含まれます。このようなフィールドタイプの合理的な設計と最適化により、ビジネス計算効率が大幅に向上し、システムパフォーマンスが改善されます。
Schemaタイプを定義する際は、固定長および低精度タイプを優先する原則に従ってください。
まとめ
要約すると、適切に設計されたSchemaはDorisの機能を最大限に活用し、ビジネスパフォーマンスを大幅に向上させることができます。逆に、最適化されていないSchema設計は、データスキューの発生など、ビジネスに全体的な悪影響を与える可能性があります。そのため、初期のSchema設計最適化作業は特に重要です。