データベースにおいて、テーブルの断片化とは、割り当てられたものの実際にはデータが格納されていないディスク領域を指します。テーブルの断片化は主に以下の操作によって発生します:
頻繁なDELETEまたはUPDATE操作:データが削除されると、元の領域は「再利用可能」としてマークされますが、すぐに回収されることはなく、空洞、すなわち断片が形成されます。
ページ分割(Page Split):データの更新によりページ(Page)の容量が不足すると、ストレージエンジンはページを複数の連続しないブロックに分割し、断片化が発生します。
OceanBaseデータベースV4.x系では、ビューCDB_OB_TABLE_SPACE_usage(システムテナント)またはDBA_OB_TABLE_SPACE_USAGE(ユーザーテナント)を使用して、テーブルの断片化を確認できます。
システムテナント
システムテナントでは、以下のステートメントを使用して確認できます。
obclient> SELECT DATABASE_NAME,TABLE_NAME, ROUND(OCCUPY_SIZE / 1024 / 1024 / 1024, 2) AS DATA_GB, ROUND(REQUIRED_SIZE / 1024 / 1024 / 1024, 2) AS ALLOCATED_GB, ROUND((REQUIRED_SIZE - OCCUPY_SIZE) / 1024 / 1024 / 1024, 2) AS EMPTY_GB FROM oceanbase.CDB_OB_TABLE_SPACE_USAGE WHERE TENANT_NAME = 'tenant_name' ORDER BY EMPTY_GB DESC;ユーザーテナント
MySQLモードのユーザーテナントでは、以下のステートメントを使用して確認できます。
obclient> SELECT DATABASE_NAME,TABLE_NAME, ROUND(OCCUPY_SIZE / 1024 / 1024 / 1024, 2) AS DATA_GB, ROUND(REQUIRED_SIZE / 1024 / 1024 / 1024, 2) AS ALLOCATED_GB, ROUND((REQUIRED_SIZE - OCCUPY_SIZE) / 1024 / 1024 / 1024, 2) AS EMPTY_GB FROM oceanbase.DBA_OB_TABLE_SPACE_USAGE ORDER BY EMPTY_GB DESC;Oracleモードのユーザーテナントでは、以下のステートメントを使用して確認できます。
obclient> SELECT DATABASE_NAME,TABLE_NAME, ROUND(OCCUPY_SIZE / 1024 / 1024 / 1024, 2) AS DATA_GB, ROUND(REQUIRED_SIZE / 1024 / 1024 / 1024, 2) AS ALLOCATED_GB, ROUND((REQUIRED_SIZE - OCCUPY_SIZE) / 1024 / 1024 / 1024, 2) AS EMPTY_GB FROM SYS.DBA_OB_TABLE_SPACE_USAGE ORDER BY EMPTY_GB DESC;
ステートメント内で:
DATA_GB:テーブル圧縮後に実際に格納されるデータ量。ALLOCATED_GB:テーブル圧縮後に格納されるデータが実際に占有するディスク容量。OceanBaseデータベースのストレージは、マクロブロック(デフォルトで2MB)単位で割り当てられ、これは実際に割り当てられたマクロブロックの総量を示します。データが上限でなくても、完全なマクロブロックが占有されます。
EMPTY_GB:断片領域、すなわちALLOCATED_GB - DATA_GBの値であり、有効に利用されていないストレージ容量を示します。