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