【Tips】Redshiftでユーザーごとにデフォルトのスキーマを設定し、テーブル名のみでクエリする

どうも!DA部の春田です。

表題の件について、Redshiftのsearch_pathを使用した方法をご紹介します。

問題

オンプレからRedshiftへの移行ケースで、オンプレではDB単位、Redshiftではスキーマ単位でテーブルが分かれている場合、オンプレ環境で使用していたスキーマ名が指定されていないSQLは、Redshiftでそのまま実行することができません。

解決策

この場合、ユーザーごとにデフォルトで参照しに行くスキーマを設定することで、テーブル名のみでもクエリすることができるようになります。具体的には、ALTER USER username SET search_path to schema_nameでユーザーごとに任意のスキーマ名でsearch_pathを設定しておきます。

-- awsuserでログインしてクエリを実行する
create schema dwh;
create table public.sales (name text);
create table dwh.sales (name text);
insert into public.sales values('public');
insert into dwh.sales values('dwh');

-- デフォルトではpublicスキーマを参照するようになっている
select * from sales; -- -> public

-- ALTER USER SETでユーザーごとにsearch_pathを設定する
alter user awsuser set search_path to dwh;

-- 変更後、salesを参照するとdwhスキーマを見に行くようになる。
select * from sales; -- -> dwh

ALTER USER SETでは、そのユーザーのすべてのセッションに対して、指定したパラメータをデフォルト値として設定できます。search_path以外にも、例えばenable_result_cache_for_sessionoffに設定しておけば、クエリ結果でキャッシュを見にいかず、毎回必ずクエリが実行されるようになります。パフォーマンス検証用のユーザーなどに設定しておけば便利ですね。また、wlm_query_slot_countで任意の数値を設定しておけば、ユーザーごとにWLMのスロット数を決めておくことができます。

詳細は、設定リファレンス - Amazon Redshiftをご参照ください。

参照