概要
Fabric レイクハウスでは本来 STRING
型で問題ありませんが、
テーブルが反映される SQL 分析エンドポイント経由で見ると、STRING
は自動的に VARCHAR(8000)
に変換されます。
この変換により、オプティマイザが不要に大きな列幅を前提としてしまい、クエリプランに影響が出る可能性があります。
SQL 分析エンドポイントへの自動反映について
Fabric の Lakehouse に作成した Delta テーブルは、SQL分析エンドポイントに自動的にテーブルとして反映されます。
SQL 分析エンドポイント上でも、Delta テーブルはSQLテーブルとして透過的に扱われ、マニュアルでのスキーマ登録は不要です。
この SQL 分析エンドポイントは T-SQL エンジンで動作しており、Power BI や外部ツールから直接接続してクエリを実行できます。
Lakehouse のテーブルは、自動的に Lakehouse の SQL 分析エンドポイントで利用できるようになります。
引用: Automatically generated schema in the SQL analytics endpoint of the Lakehouse - Microsoft Fabric
実際の例
Lakehouse 上で VARCHAR(50)
を定義し、SQL 分析エンドポイントで参照した場合の例です。
DDL
-- シンプルなテーブル定義(VARCHAR 長さ指定の例)
CREATE TABLE IF NOT EXISTS `sample_table` (
id INT NOT NULL COMMENT '主キー',
name_varchar VARCHAR(50) COMMENT '名前(最大50文字)',
name_string STRING COMMENT '名前(文字長無し)'
)
USING delta
COMMENT 'VARCHAR の長さ指定例(Lakehouse 定義)';
4倍変換の理由について
レイクハウス上で VARCHAR
の文字数を明示的に指定した場合、SQL 分析エンドポイント上では
Lakehouse 側で指定した文字長 × 4バイト の VARCHAR
として定義されます。
これはマルチバイト文字格納で考えた場合に最大4バイト/文字を見積もるためと考えられます。
例:
- Lakehouse:
VARCHAR(100)
→ SQL 分析EP:VARCHAR(400)
- Lakehouse:
VARCHAR(800)
→ SQL 分析EP:VARCHAR(3200)
Microsoft Learn のパフォーマンスガイドライン
公式のパフォーマンスガイドラインでも、文字長を適切に構成することが重要 とされています。
そのため、Fabric レイクハウスでは VARCHAR
を明示指定し、SQL分析エンドポイントが必要十分な文字長で定義されるようにすることを推奨します。
参考: Guidelines for warehouse performance - Microsoft Fabric
まとめ
-
STRING
型は SQL 分析エンドポイントではVARCHAR(8000)
に変換され、プラン最適化に悪影響を及ぼす可能性がある。 -
VARCHAR
を明示指定すると、指定長の4倍バイト長として扱われる(UTF-8 最大4バイト/文字換算)。 - 公式ガイドラインでも文字長指定は推奨されているため、必要十分な長さで
VARCHAR
を定義するのが望ましい。