Redshiftで各テーブルのカラム毎の利用ブロック数を確認する

2023.03.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部のueharaです。

今回はAmazon Redshiftで各テーブルのカラム毎の利用ブロック数を確認するという処理をしてみたいと思います。

Redshiftのブロックサイズについて

Redshiftは列指向型のデータベースであり、各データブロックには複数行に渡る1つのカラムの値が格納されます。

参考

特に、Redshiftでは1MBのブロックサイズを採用しています。

一般的なデータベースのブロックサイズは2KB~32KBのため、それと比較するとRedshiftは大きい値となっており、この大きめに取られたブロックサイズがクエリを高速に処理可能な要因の1つになっています。

テーブル毎のレコード数と、それに対しカラム毎で利用されているブロック数を把握することは、将来のテーブルサイズを見積もる上での有用な参考情報となります。

以下で、Redshiftの各テーブルのカラム毎の利用ブロック数を確認する方法を紹介します。

利用ブロック数の確認

まず結論から、STV_BLOCKLISTを利用することでデータベース内の各スライス、テーブル、カラムで使用されているブロック数を確認することができます。

上記公式ドキュメントではテーブル名を指定してカラム番号と利用ブロック数を表示させるサンプルクエリが記載されていますが、ここでは全テーブルに対し、カラム名といった情報も付加して出力するクエリを紹介します。

SQLは以下の通りです。

WITH table_info AS (
  SELECT
    database,
    schema,
    "table",
    table_id,
    column_name,
    ordinal_position
  FROM SVV_TABLE_INFO
  JOIN SVV_COLUMNS ON
    SVV_TABLE_INFO.schema = SVV_COLUMNS.table_schema AND
    SVV_TABLE_INFO."table" = SVV_COLUMNS.table_name
),
block_cnt_info AS (
  SELECT
    slice,
    tbl,
    col,
    MAX(num_values) AS max_num_values,
    COUNT(*) AS block_cnt
  FROM STV_BLOCKLIST
  GROUP BY slice, tbl, col
)
SELECT
  slice,
  database,
  schema AS schema_name,
  "table" AS table_name,
  column_name,
  ordinal_position AS column_no,
  max_num_values,
  block_cnt
FROM block_cnt_info
JOIN table_info ON
  block_cnt_info.tbl = table_info.table_id AND
  block_cnt_info.col = table_info.ordinal_position
-- adminスキーマの情報は不要なため除外
WHERE schema <> 'admin'
ORDER BY database, schema, "table", ordinal_position, slice

上記の例では、まずSVV_TABLE_INFOからスキーマ名やテーブル名、カラム名といったテーブル情報をテーブルIDと共に一時テーブルに取得し、SVV_BLOCKLISTで取得したブロック数の一時テーブルと結合して出力するといった形を取っています。

出力される結果のテーブルは以下の構成となっています。

カラム名 説明
slice ノードスライス
database データベース名
schema_name スキーマ名
table_name テーブル名
column_name カラム名
colimn_no カラム番号
max_num_values 1ブロック中に含まれるレコード数の最大値
block_cnt ブロック数

具体的には、以下のようなデータが確認できると思います。

slice database schema_name table_name column_name column_no max_num_values block_cnt
1 db-01 schema_1 table_X aaa 1 10 1
1 db-01 schema_1 table_X bbb 2 10 1
0 db-01 schema_1 table_Y ccc 1 1000 4
0 db-01 schema_1 table_Y ddd 2 2000 2
0 db-01 schema_1 table_Y eee 3 500 8

最後に

今回はAmazon Redshiftで各テーブルのカラム毎の利用ブロック数を確認するという処理をしてみました。

参考になりましたら幸いです。

参考文献