InfiniDBの特徴の1つである水平パーティションは、エクステントマップ機能によって実現されています。
InfiniDB 4.0までのバージョンでは、エクステントマップを効果的に活用するために、VIEWの使用方法に留意する必要があります。
下記例1のように、VIEWに対して実行するSELECT文にWHERE句を付与した場合はエクステントマップが使用されず、例2のように、VIEW作成時のCREATE文にWHERE句を付与した場合はエクステントマップが使用されます。
例1.エクステントマップが使用されないケース
■ビュー作成
1 2 3 4 |
mysql> CREATE VIEW v_test1 AS -> SELECT lo_orderkey, lo_orderdate, lo_orderpriority -> FROM lineorder -> GROUP BY lo_orderkey, lo_orderdate, lo_orderpriority; |
■SELECT実行
1 2 |
mysql> SELECT count(*) FROM v_test1 WHERE lo_orderdate=19970808; ※Viewに対してのWHERE句。エクステントマップが使用されない |
■SQLの実行計画
1 2 3 4 5 6 7 8 9 |
mysql> SELECT calgettrace()\G; *************************** 1. row *************************** calgettrace(): Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM lineorder 3016 (lo_orderdate,lo_orderkey,lo_orderpriority) 0 16599430 0 41.836 180034408 TAS UM - - - - - - 5.100 1 ※実行計画の「PBE」はPartitionBlocksEliminated の略称で、エクステントマップにより除外された ブロック数を示します。 |
例2.エクステントマップが使用されるケース
■ビュー作成
1 2 3 4 5 |
mysql> CREATE VIEW v_test2 AS -> SELECT lo_orderkey, lo_orderdate, lo_orderpriority -> FROM lineorder -> WHERE lo_orderdate=19970808 -> GROUP BY lo_orderkey, lo_orderdate, lo_orderpriority; |
■SELECT実行
1 |
mysql> SELECT count(*) FROM v_test2; |
■SQLの実行計画
1 2 3 4 5 6 7 8 9 |
mysql> SELECT calgettrace()\G; *************************** 1. row *************************** calgettrace(): Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM lineorder 3016 (lo_orderdate,lo_orderkey,lo_orderpriority) 10244 11203 343395 0.276 74950 TAS UM - - - - - - 0.003 1 ※実行計画の「PBE」はPartitionBlocksEliminated の略称で、エクステントマップにより除外された ブロック数を示します。 |
なお、InfiniDB 4.5以降では本注意事項は該当せず、例1の内容であってもエクステントマップが使用されます。