データベースにおいて、テーブルの断片化とは、割り当てられているが実際にはデータが格納されていないディスク容量を指します。テーブルの断片化は主に以下の操作によって発生します:
頻繁な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の値で、有効に利用されていないストレージ容量を示します。