ablog

不器用で落着きのない技術者のメモ

Amazon Redshift で Late Binding View から通常 View を参照している場合、通常 View を Drop & Create することができる

Amazon Redshift で Late Binding View から通常 View を参照している場合、通常 View を Drop & Create することができることを確認した。
通常 View から通常 View を参照している場合は、依存関係があるため、参照元 View を Drop できない(CASCADE オプションをつけると依存関係のある View も削除される)。

通常 View の場合: 依存関係があるため参照元 View を Drop できない

  • テーブル定義を確認する
awsuser 00:58 =# show table dev.public.customer;
                    Show Table DDL statement
-----------------------------------------------------------------
 CREATE TABLE public.customer (                                 +
     c_custkey integer NOT NULL ENCODE az64,                    +
     c_name character varying(25) NOT NULL ENCODE lzo,          +
     c_address character varying(25) NOT NULL ENCODE lzo,       +
     c_city character varying(10) NOT NULL ENCODE bytedict,     +
     c_nation character varying(15) NOT NULL ENCODE raw,        +
     c_region character varying(12) NOT NULL ENCODE bytedict,   +
     c_phone character varying(15) NOT NULL ENCODE lzo,         +
     c_mktsegment character varying(10) NOT NULL ENCODE bytedict+
 )                                                              +
 DISTSTYLE EVEN                                                 +
 SORTKEY ( c_nation, c_region );
(1 row)

Time: 39.377 ms
  • View を作成する
awsuser 01:13 =# create view dev.public.v_customer as select c_custkey, c_name from dev.public.customer;
CREATE VIEW
Time: 314.311 ms
awsuser 01:13 =# create view dev.public.vv_customer as select c_custkey, c_name from dev.public.v_customer;
CREATE VIEW
Time: 247.827 ms
  • 参照元ビューを作り直す(カラム追加) <-- 依存関係があるため DROP View できない
awsuser 01:13 =# drop view dev.public.v_customer;
NOTICE:  view vv_customer depends on view v_customer
ERROR:  cannot drop view v_customer because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
Time: 13.303 ms

Late Binding View の場合: 参照元 View を Drop & Create できる

  • テーブル定義を確認する
awsuser 00:58 =# show table dev.public.customer;
                    Show Table DDL statement
-----------------------------------------------------------------
 CREATE TABLE public.customer (                                 +
     c_custkey integer NOT NULL ENCODE az64,                    +
     c_name character varying(25) NOT NULL ENCODE lzo,          +
     c_address character varying(25) NOT NULL ENCODE lzo,       +
     c_city character varying(10) NOT NULL ENCODE bytedict,     +
     c_nation character varying(15) NOT NULL ENCODE raw,        +
     c_region character varying(12) NOT NULL ENCODE bytedict,   +
     c_phone character varying(15) NOT NULL ENCODE lzo,         +
     c_mktsegment character varying(10) NOT NULL ENCODE bytedict+
 )                                                              +
 DISTSTYLE EVEN                                                 +
 SORTKEY ( c_nation, c_region );
(1 row)

Time: 39.377 ms
  • View を作成する
create view dev.public.v_customer as select c_custkey, c_name from dev.public.customer;
create view dev.public.lbvv_customer as select c_custkey, c_name from dev.public.v_customer with no schema binding;;
  • 参照元ビューを作り直す(カラム追加) <-- 依存関係があるため DROP View できない
awsuser 01:19 =# drop view dev.public.v_customer;
DROP VIEW
Time: 306.214 ms
awsuser 01:19 =# create view dev.public.v_customer as select c_custkey, c_name, c_address from dev.public.customer;
CREATE VIEW
Time: 387.308 ms
  • Late Binding View を参照できることを確認する。
awsuser 01:19 =# show view dev.public.lbvv_customer;
                                               Show View DDL statement
---------------------------------------------------------------------------------------------------------------------
 create view dev.public.lbvv_customer as select c_custkey, c_name from dev.public.v_customer with no schema binding;
(1 row)

Time: 3.828 ms

awsuser 01:20 =# select count(*) from dev.public.lbvv_customer;
  count
----------
 40502000
(1 row)

Time: 98.776 ms