本稿では、CSI (Column store Index) 列ストレージインデックス機能がサポートするステートメントと制限シナリオをご紹介します。
前提条件
カーネルバージョンは TDSQL-C for MySQL 8.0 バージョン3.1.14以上です。
説明:
読み取り専用インスタンスの場合、バージョン要件を満たす条件下で、4コア以上の読み取り専用インスタンスのみ列ストレージインデックス機能を有効化できます。
対応ステートメント
TDSQL-C for MySQL は、以下の特徴を備えた SQL文 のクエリプッシュダウン処理をすでに実現しました。そして、より多くの機能シナリオを徐々に充実させています。
機能シナリオ | 説明 |
単一テーブルスキャン | 単一テーブルスキャンにおいて、フルテーブルスキャン、インデックススキャン、インデックス範囲スキャンなどのスキャンタイプの順方向・逆方向スキャンをサポートしています。 |
複数テーブル join | 複数テーブルジョインにおいて、ネステッドループジョイン、ハッシュジョイン、ソートマージジョインなどの多様なジョインアルゴリズムをサポートします。 |
サブクエリ | サブクエリにおいては、非相関サブクエリをサポートしています。 |
データ型 | データ型に関しては、整数型データ、文字列型データ、浮動小数点型データ、日時型データなど、複数のデータ型を含むクエリをサポートします。 |
演算式 | 算術式演算(+、-、*、%、/、|、&)、条件式演算(<、<=、>、>=、<>、between and、In など)、論理演算(or、and、not など)、一般関数(文字列関数、整数関数、日付関数など)、集計関数(count/sum/avg/min/max など)をサポートします。 |
プッシュダウン実行計画を表示する | Explainによるプッシュダウン実行計画の表示をサポートしていますが、COLUMNSTOREマークはExplain format=treeでのみ表示されます。 |
機能制限
TDSQL-C for MySQLはCSIクエリ能力を継続的に強化していきます。現時点でCSIクエリが利用できないシナリオは次の通りです:
CSIの作成に関する制限
同一テーブルにはCSIインデックスを1つしか作成できません。
Generated Column、BLOB、TEXT、JSON、BIT、GEOMETRYを使用したCSIの作成はサポートされていません。
COPYアルゴリズムを使用したCSIの作成・削除、またはCSIを削除してから再追加する操作はサポートされていません。
InnoDB以外のテーブルではCSIの作成はサポートされていません。
CSIテーブルに対するDDL制限
CSIテーブルに対するパーティション操作はサポートされていません。
SELECTでのCSI使用の制限事項
DMLにおけるSELECT、INSERT ... SELECT/REPLACE ... SELECTはサポートしていません。
CTEはサポートされていません。
ウィンドウ関数はサポートされていません。
with rollupはサポートしていません。
UNIONはサポートされていません。
ReadCommit以外の分離レベルのトランザクションはサポートしていません。
ロック付き読み取りステートメント(例:SELECT FOR UPDATE/SHARE LOCKなど)はサポートしていません。
ストアドプロシージャはサポートされていません。
SQL_MODEのMODE_PAD_CHAR_TO_FULL_LENGTH/MODE_INVALID_DATESはサポートされていません。
GIS関連関数(例:SP_WITHIN_FUNC、st_distanceなど)はサポートしていません。
ユーザー定義関数はサポートしていません。
XML関連関数(xml_str)はサポートしていません。
ロック関連の関数(is_free_lock、is_used_lock、release_lock、release_all_locks、get_lock)はサポートしていません。
注意事項
CSIクエリと通常クエリの実行結果には一定の非互換性が存在し、以下の点が含まれます。
結果セット順序なし
列ストレージの編成方式はBTreeの編成方式と異なるため、ORDER序を指定しない場合、返される結果セットはBTR実行時の結果順序と一致しない可能性があります。実際、これはANSI標準に準拠していますが、ユーザーが結果セットの順序に敏感な場合は、シリアル実行と一致した結果を得るためにソートルールの指定を推奨します。
精度と切り捨て問題
CSIを使用する場合、一部のデータ型の保存と計算精度がMySQLと完全には一致しないため、浮動小数点部分で精度の差異が生じたり切り捨てが発生したりする可能性があり、最終結果にわずかな差異が生じることがあります。
エラーやアラームの表示回数が増える可能性があります
シリアル実行でエラー/アラームが発生するクエリに対して、CSIを使用した並列実行の場合、各ワーカスレッドがエラー/アラームを発生させる可能性があり、全体のエラー/アラーム発生回数が増加することがあります。
リソースの影響
CSIのバッファプールはシステムメモリ空間を占有します。
CSIの並列実行では、シリアルクエリのシングルスレッドモードに比べて、並列クエリはより多くのスレッド、メモリ、およびIOリソースを消費します。