はじめに
Verticaでは、既存テーブルの明示的な位置を指定して列を追加することはできません。
そのため、任意の位置に列を追加するためには、主に以下のような手順を踏む必要があります。
1) 構成したい列構成で別途ワークテーブルを作成
2) 既存テーブルからワークテーブルにデータをコピー
3) 既存テーブルとワークテーブルを入れ替える
本記事では、テーブルの任意の位置に列を追加する詳細な手順をご紹介します。
テーブルの任意の位置に列を追加する方法
概要
1. 既存テーブル(CUSTOMER)のDDL(CREATE TABLE文)を出力
2. 任意の位置に列を追加したワークテーブル(CUSTOMER_WK)を作成
3. 既存テーブルからワークテーブルへデータコピー(INSERT INTO ~ SEELCT)
4. ワークテーブルを最適化
5. RENAMEにて既存テーブルとワークテーブルを入れ替え
6. ワークテーブルをDROP
例)CUSTOMERテーブルのC_PHONE列の後にC_ADD列を追加する
1. 既存テーブル(CUSTOMER)のDDL(CREATE TABLE文)を出力
#テーブル定義を確認
dbadmin=> ¥d CUSTOMER
List of Fields by Tables
Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key
--------+----------+--------------+---------------+------+---------+----------+-------------+-------------
public | CUSTOMER | C_CUSTKEY | numeric(10,0) | 8 | | f | f |
public | CUSTOMER | C_NAME | varchar(25) | 25 | | f | f |
public | CUSTOMER | C_ADDRESS | varchar(25) | 25 | | f | f |
public | CUSTOMER | C_CITY | char(10) | 10 | | f | f |
public | CUSTOMER | C_NATION | char(15) | 15 | | f | f |
public | CUSTOMER | C_REGION | char(12) | 12 | | f | f |
public | CUSTOMER | C_PHONE | char(15) | 15 | | f | f |
public | CUSTOMER | C_MKTSEGMENT | char(10) | 10 | | f | f |
(8 rows)
#テーブル定義をエクスポート
dbadmin=> select export_tables('','CUSTOMER');
export_tables
----------------------------------------------------------------------------------------------------
CREATE TABLE public.CUSTOMER
(
C_CUSTKEY numeric(10,0),
C_NAME varchar(25),
C_ADDRESS varchar(25),
C_CITY char(10),
C_NATION char(15),
C_REGION char(12),
C_PHONE char(15),
C_MKTSEGMENT char(10)
);
(1 row)2. 任意の位置に列を追加したワークテーブル(CUSTOMER_WK)を作成
先ほどの手順で出力したテーブル定義をもとに、CUSTOMERテーブルのC_PHONE列の後にC_ADD列を追加したワークテーブル(CUSTOMER_WK)を作成します。
#カラムを追加したワークテーブルの作成
dbadmin=> CREATE TABLE public.CUSTOMER_WK
dbadmin-> (
dbadmin(> C_CUSTKEY numeric(10,0),
dbadmin(> C_NAME varchar(25),
dbadmin(> C_ADDRESS varchar(25),
dbadmin(> C_CITY char(10),
dbadmin(> C_NATION char(15),
dbadmin(> C_REGION char(12),
dbadmin(> C_PHONE char(15),
dbadmin(> C_ADD int, --追加したカラム
dbadmin(> C_MKTSEGMENT char(10)
dbadmin(> );
CREATE TABLE
#ワークテーブルの定義を確認
dbadmin=> ¥d CUSTOMER_WK;
List of Fields by Tables
Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key
--------+-------------+--------------+---------------+------+---------+----------+-------------+-------------
public | CUSTOMER_WK | C_CUSTKEY | numeric(10,0) | 8 | | f | f |
public | CUSTOMER_WK | C_NAME | varchar(25) | 25 | | f | f |
public | CUSTOMER_WK | C_ADDRESS | varchar(25) | 25 | | f | f |
public | CUSTOMER_WK | C_CITY | char(10) | 10 | | f | f |
public | CUSTOMER_WK | C_NATION | char(15) | 15 | | f | f |
public | CUSTOMER_WK | C_REGION | char(12) | 12 | | f | f |
public | CUSTOMER_WK | C_PHONE | char(15) | 15 | | f | f |
public | CUSTOMER_WK | C_ADD | int | 8 | | f | f |★追加したカラム
public | CUSTOMER_WK | C_MKTSEGMENT | char(10) | 10 | | f | f |
(9 rows)C_PHONE列の後にC_ADD列が存在するCUSTOMER_WKテーブルを作成することができました。
3. 既存テーブルからワークテーブルへデータコピー(INSERT INTO ~ SEELCT文)
#既存テーブルのデータ件数を確認
dbadmin=> select count(*) from CUSTOMER;
count
---------
3750000
(1 row)
#INSERT INTO ~ SEELCT文にてワークテーブルへデータコピー
dbadmin=> INSERT /*+DIRECT*/ INTO CUSTOMER_WK
dbadmin-> (
dbadmin(> C_CUSTKEY,
dbadmin(> C_NAME,
dbadmin(> C_ADDRESS,
dbadmin(> C_CITY,
dbadmin(> C_NATION,
dbadmin(> C_REGION,
dbadmin(> C_PHONE,
dbadmin(> C_MKTSEGMENT
dbadmin(> )
dbadmin-> SELECT
dbadmin-> C_CUSTKEY,
dbadmin-> C_NAME,
dbadmin-> C_ADDRESS,
dbadmin-> C_CITY,
dbadmin-> C_NATION,
dbadmin-> C_REGION,
dbadmin-> C_PHONE,
dbadmin-> C_MKTSEGMENT
dbadmin-> FROM CUSTOMER
dbadmin-> ;
OUTPUT
---------
3750000
(1 row)
#ワークテーブルのデータを確認
既存テーブルのデータ件数と同じであることを確認します。
dbadmin=> select count(*) from CUSTOMER_WK;
count
---------
3750000
(1 row)
#データのコミット
dbadmin=> commit;
COMMIT既存テーブルからワークテーブルへデータをコピーすることができました。
4. ワークテーブルを最適化
Verticaは新規テーブルにデータを投入した後、テーブルを最適化する必要があります。
以下の技術情報サイトの手順を参考にテーブルの最適化を実行ください。
https://www.ashisuto.co.jp/cm/analytics-database/table_dbd.html
5. RENAMEにて既存テーブルとワークテーブルを入れ替え
テーブルをRENAMEし、CUSTOMERテーブルとCUSTOMER_WKを入れ替えます。この手順により既存テーブルの任意の位置に列を追加した状態となります。
補足:VerticaのRENAMEは一度に複数のテーブルをRENAMEすることができるため、アクセス不可の時間無くテーブルを入れ替えることができます。RENAMEの詳細については、以下の技術情報サイトをご参照ください。
https://www.ashisuto.co.jp/cm/analytics-database/table_rename.html
#ALTER TABLE ~ RENAME文にてテーブル入れ替え
dbadmin=> ALTER TABLE CUSTOMER, CUSTOMER_WK, temps RENAME TO temps, CUSTOMER, CUSTOMER_WK ;
ALTER TABLE
dbadmin=> ¥d
List of tables
Schema | Name | Kind | Owner | Comment
--------+-------------+-------+---------+---------
public | CUSTOMER | table | dbadmin |
public | CUSTOMER_WK | table | dbadmin |
(2 rows)
#CUTOMERテーブルにC_ADD列が追加されていることを確認
dbadmin=> select * from CUSTOMER limit 1;
C_CUSTKEY | C_NAME | C_ADDRESS | C_CITY | C_NATION | C_REGION | C_PHONE | C_ADD | C_MKTSEGMENT
-----------+--------------------+-------------+------------+-----------------+--------------+-----------------+-------+--------------
101 | Customer#000000101 | eEfYAdMjnG | BRAZIL 0 | BRAZIL | AMERICA | 12-242-921-3794 | | MACHINERYCUSTOMERテーブルのC_PHONE列の後にC_ADD列が追加された状態となっていることを確認できました。
6. ワークテーブルをDROP
不要になったワークテーブルをDROPすれば、列の追加作業は完了です。
dbadmin=> drop table CUSTOMER_WK cascade;
DROP TABLE検証バージョンについて
この記事の内容はVertica 9.1で確認しています。