プログラマーな日々

プログラマーです。AWS認定ソリューションアーキテクト–アソシエイト。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

RedshiftのよくあるTips

RedshiftのよくあるTipsです。随時更新します。

テーブルの分散キーとソートキーを確認したい

fooSchamabarTableがあるとして、

-- 検索パスにスキーマを追加する(セッション内で有効)
set search_path to '$user', public, 'fooSchama';

SELECT * FROM pg_table_def WHERE schemaname = 'fooSchama' AND tablename = 'barTable' AND (distkey = true OR sortkey > 0);

dev.classmethod.jp

エクスポートするCSVにヘッダを付けたい

UNLOADでHEADERオプションを指定します。

HEADERオプションがサポートされる前は、こんなSQLを書く必要がありました。

UNLOAD (
    'SELECT
        column1,
        column2,
        column3
    FROM (
        SELECT
            ''column1'' AS column1,
            ''column2'' AS column2,
            ''column3'' AS column3
            1 as row_num
        WHERE 1 = 1
        UNION ALL
        SELECT
            CAST(column1 AS VARCHAR) AS column1,
            CAST(column2 AS VARCHAR) AS column2,
            CAST(column3 AS VARCHAR) AS column3,
            2 as row_rum
        FROM fooSchema.barTable
    ) T ORDER BY row_num)
TO 's3://bucketname/filename'
CREDENTIALS 'credentials';

HEADERオプションを使うとシンプルに書けます。

UNLOAD ('SELECT * FROM fooSchema.barTable)
TO 's3://bucketname/filename'
CREDENTIALS 'credentials'
HEADER;

dev.classmethod.jp

キャッシュを無効化したい

パフォーマンステストで必須です。

セッションレベルで無効化する方法 set enable_result_cache_for_session=off; ユーザーレベルで無効化する方法 ALTER USER awsuser SET enable_result_cache_for_session = off;

Redshift のリザルトキャッシュを無効化する方法 - ablog

検証

SELECT * FROM tableName LIMIT 1の結果セットがキャッシュされたものか?

SELECT * FROM SVL_QLOG WHERE substring = 'SELECT * FROM tableName LIMIT 1';
userid query xid pid starttime endtime elapsed aborted label substring source_query concurrency_scaling_status_txt from_sp_call
112 3901 12973817 31495 2019/6/24 4:44 2019/6/24 4:44 8892 0 default SELECT * FROM tableName LIMIT 1 0 - Ran on the main cluster

source_queryがNullなので、キャッシュされていない。

ユーザーにテーブル権限を付与したい

-- スキーマへのALL権限
GRANT ALL ON SCHEMA schemaName TO userName;

-- スキーマの既存テーブルへのALL権限
GRANT ALL ON ALL TABLES IN SCHEMA schemaName TO userName;

-- デフォルト権限を設定して、新たに作成されたテーブルをreadOnlyUserNameが参照可能にする
ALTER DEFAULT PRIVILEGES IN SCHEMA schemaName GRANT SELECT ON TABLES TO readOnlyUserName;

dev.classmethod.jp

dev.classmethod.jp