Amazon Redshift 分散スタイルのテーブル最適化を有効化するビューを作成してみた

Amazon Redshift 分散スタイルのテーブル最適化を有効化するビューを作成してみた

Clock Icon2024.11.15

AWS事業本部コンサルティング部の石川です。テーブルの分散スタイルを「AUTO」に一括で自動設定に変更したり、元の設定に戻したりするためのSQLを生成するビューの作成しましたので紹介します。

分散スタイルを自動的に設定する機能とは

Amazon Redshiftのテーブル分散スタイルは、ノード毎のデータ偏りや複数テーブル間の結合におけるパフォーマンスに重要な影響を与えます。従来は手動設定でしたが、現在は自動テーブル最適化(ATO)という機能があり、分散スタイルを自動的に設定します。

ATOは機械学習を用いて、クエリとテーブルの相互作用を監視し、クラスターのワークロードパフォーマンスを最適化します。ただし、この機能は各テーブルに個別に適用する必要があるため、一括で有効化したり元の設定に戻すためのSQLを生成するビューを作成しました。

分散スタイルのテーブル自動設定するためのビュー

テーブルの分散スタイルをバックアップするための DDL を取得するためのビューです。ソート キーが設定されている既存のテーブルのソート キー設定をバックアップします。分散スタイルが設定されているテーブルを後で元の分散スタイル設定に復元するための SQL を生成します。

v_generate_alter_diststyle_backup_ddl

--DROP VIEW admin.v_generate_alter_diststyle_backup_ddl;
/**********************************************************************************************
Purpose: View to retrieve the DDL for the diststyles of existing tables.

Notes:   Backup the diststyle settings of existing tables with diststyle configured.
         Generate SQL to restore tables with diststyles to their original diststyle settings later.

         The following filters are useful:
           where tablename in ('t1', 't2')     -- only get DDL for specific tables
           where schemaname in ('s1', 's2')    -- only get DDL for specific schemas

History:
2024-11-15 Satoru Ishikawa Created
**********************************************************************************************/
CREATE OR REPLACE VIEW v_generate_alter_diststyle_backup_ddl
AS
SELECT
 table_id
 ,schemaname
 ,tablename
 ,seq
 ,ddl
FROM
 (
 --DISTSTYLE
  SELECT
  c.oid::bigint as table_id
  ,n.nspname AS schemaname
  ,c.relname AS tablename
  ,300000001 AS seq
  ,CASE WHEN c.reldiststyle = 0 THEN 'ALTER TABLE ' || c.relname || ' ALTER DISTSTYLE EVEN;'
   WHEN c.reldiststyle = 1 THEN 'ALTER TABLE ' || c.relname || ' ALTER '
   WHEN c.reldiststyle = 8 THEN 'ALTER TABLE ' || c.relname || ' ALTER DISTSTYLE ALL;'
   WHEN c.reldiststyle = 9 THEN 'ALTER TABLE ' || c.relname || ' ALTER DISTSTYLE AUTO;'
   ELSE '<<Error - UNKNOWN DISTSTYLE>>'
   END AS ddl
 FROM pg_namespace AS n
 INNER JOIN pg_class AS c ON n.oid = c.relnamespace
 WHERE c.relkind = 'r'
 --DISTKEY COLUMNS
 UNION SELECT
  c.oid::bigint as table_id
  ,n.nspname AS schemaname
  ,c.relname AS tablename
  ,400000000 + a.attnum AS seq
  ,'DISTKEY (' + QUOTE_IDENT(a.attname) + ');' AS ddl
 FROM pg_namespace AS n
 INNER JOIN pg_class AS c ON n.oid = c.relnamespace
 INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
 WHERE c.relkind = 'r'
   AND c.reldiststyle <> 9
   AND a.attisdistkey IS TRUE
   AND a.attnum > 0
)
ORDER BY table_id,schemaname, tablename, seq
;

実行結果の例

dev=# select * from v_generate_alter_diststyle_backup_ddl where schemaname = 'public';
 table_id | schemaname | tablename |    seq    |                    ddl                     
----------+------------+-----------+-----------+--------------------------------------------
   277586 | public     | orders    | 300000001 | ALTER TABLE orders ALTER DISTSTYLE AUTO;
   277588 | public     | returns   | 300000001 | ALTER TABLE returns ALTER DISTSTYLE AUTO;
   293976 | public     | category  | 300000001 | ALTER TABLE category ALTER DISTSTYLE AUTO;
   293979 | public     | date      | 300000001 | ALTER TABLE date ALTER DISTSTYLE AUTO;
   293982 | public     | event     | 300000001 | ALTER TABLE event ALTER DISTSTYLE AUTO;
   293985 | public     | listing   | 300000001 | ALTER TABLE listing ALTER DISTSTYLE AUTO;
   293988 | public     | sales     | 300000001 | ALTER TABLE sales ALTER DISTSTYLE AUTO;
   293991 | public     | users     | 300000001 | ALTER TABLE users ALTER DISTSTYLE AUTO;
   293994 | public     | venue     | 300000001 | ALTER TABLE venue ALTER DISTSTYLE AUTO;
   302174 | public     | part      | 300000001 | ALTER TABLE part ALTER DISTSTYLE AUTO;
   326738 | public     | testtab   | 300000001 | ALTER TABLE testtab ALTER 
   326738 | public     | testtab   | 400000001 | DISTKEY (catid);
   334930 | public     | testtab1  | 300000001 | ALTER TABLE testtab1 ALTER 
   334930 | public     | testtab1  | 400000001 | DISTKEY (catid);
(14 rows)

分散スタイルのテーブル「AUTO」設定するためのビュー

テーブルの分散スタイルを「AUTO」に設定するための DDLを取得するためのビューです。分散スタイルが設定されている既存のテーブルの分散スタイル設定を「AUTO」に変更するための SQL を生成します。

v_generate_alter_diststyle_auto_ddl

 /**********************************************************************************************
Purpose: View to retrieve the DDL for setting the diststyles of a table to "AUTO".

Notes:   Set the diststyle to "AUTO" for existing tables that already have diststyle configured. 
         It is recommended to backup the existing diststyle settings so that you can revert to 
         the original configuration later if needed.

         The following filters are useful:
           where tablename in ('t1', 't2')     -- only get DDL for specific tables
           where schemaname in ('s1', 's2')    -- only get DDL for specific schemas

History:
2024-11-15 Satoru Ishikawa Created
**********************************************************************************************/
CREATE OR REPLACE VIEW public.v_generate_alter_diststyle_auto_ddl
AS
 SELECT
  table_id
  ,schemaname
  ,tablename
  ,seq
  ,ddl
 FROM
  (
  --DISTSTYLE
   SELECT
   c.oid::bigint as table_id
   ,n.nspname AS schemaname
   ,c.relname AS tablename
   ,300000001 AS seq
   ,'ALTER TABLE ' || c.relname || ' ALTER DISTSTYLE AUTO;' AS ddl
  FROM pg_namespace AS n
  INNER JOIN pg_class AS c ON n.oid = c.relnamespace
  WHERE c.relkind = 'r'
)
ORDER BY table_id,schemaname, tablename, seq
;

実行結果の例

dev=# select * from v_generate_alter_diststyle_auto_ddl where schemaname = 'public';
 table_id | schemaname | tablename |    seq    |                    ddl                     
----------+------------+-----------+-----------+--------------------------------------------
   277586 | public     | orders    | 300000001 | ALTER TABLE orders ALTER DISTSTYLE AUTO;
   277588 | public     | returns   | 300000001 | ALTER TABLE returns ALTER DISTSTYLE AUTO;
   293976 | public     | category  | 300000001 | ALTER TABLE category ALTER DISTSTYLE AUTO;
   293979 | public     | date      | 300000001 | ALTER TABLE date ALTER DISTSTYLE AUTO;
   293982 | public     | event     | 300000001 | ALTER TABLE event ALTER DISTSTYLE AUTO;
   293985 | public     | listing   | 300000001 | ALTER TABLE listing ALTER DISTSTYLE AUTO;
   293988 | public     | sales     | 300000001 | ALTER TABLE sales ALTER DISTSTYLE AUTO;
   293991 | public     | users     | 300000001 | ALTER TABLE users ALTER DISTSTYLE AUTO;
   293994 | public     | venue     | 300000001 | ALTER TABLE venue ALTER DISTSTYLE AUTO;
   302174 | public     | part      | 300000001 | ALTER TABLE part ALTER DISTSTYLE AUTO;
   326738 | public     | testtab   | 300000001 | ALTER TABLE testtab ALTER DISTSTYLE AUTO;
   334930 | public     | testtab1  | 300000001 | ALTER TABLE testtab1 ALTER DISTSTYLE AUTO;
(12 rows)

最後に

Amazon Redshiftの自動テーブル最適化(ATO)は、クエリパフォーマンスを向上させるための重要な機能ですが、個々のテーブルに適用する必要があります。この課題に対処するため、二つのビューを作成しました。1つ目のビュー「v_generate_alter_diststyle_backup_ddl」は、既存の分散スタイル設定をバックアップし、後で元の設定に戻すためのSQLを生成します。2つ目のビュー「v_generate_alter_diststyle_auto_ddl」は、テーブルの分散スタイルを「AUTO」に設定するためのSQLを生成します。

これらのビューを使用することで、データベース管理者は複数のテーブルに対して一括で分散スタイルの自動設定を有効化したり、必要に応じて元の設定に戻したりすることが容易になります。この方法は、大規模なRedshiftクラスターの管理を効率化し、パフォーマンス最適化プロセスを簡素化する上で非常に有用です。ただし、変更を適用する前に、現在の設定をバックアップし、変更の影響を慎重に評価することが重要です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.