RedshiftのよくあるTipsです。随時更新します。
テーブルの分散キーとソートキーを確認したい
fooSchamaにbarTableがあるとして、
-- 検索パスにスキーマを追加する(セッション内で有効) set search_path to '$user', public, 'fooSchama'; SELECT * FROM pg_table_def WHERE schemaname = 'fooSchama' AND tablename = 'barTable' AND (distkey = true OR sortkey > 0);
エクスポートする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;
キャッシュを無効化したい
パフォーマンステストで必須です。
セッションレベルで無効化する方法 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;
ユーザーの実行権限確認
テーブルの分散キー確認
SELECT "schema", "table", diststyle FROM SVV_TABLE_INFO