はじめに
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文)を出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#テーブル定義を確認 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)を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#カラムを追加したワークテーブルの作成 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文)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#既存テーブルのデータ件数を確認 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は新規テーブルにデータを投入した後、テーブルを最適化する必要があります。以下の技術情報サイトの手順を参考にテーブルの最適化を実行ください。
http://vertica-tech.ashisuto.co.jp/table_dbd/
5. RENAMEにて既存テーブルとワークテーブルを入れ替え
テーブルをRENAMEし、CUSTOMERテーブルとCUSTOMER_WKを入れ替えます。この手順により既存テーブルの任意の位置に列を追加した状態となります。補足:VerticaのRENAMEは一度に複数のテーブルをRENAMEすることができるため、アクセス不可の時間無くテーブルを入れ替えることができます。RENAMEの詳細については、以下の技術情報サイトをご参照ください。
http://vertica-tech.ashisuto.co.jp/table_rename/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#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 | | MACHINERY |
CUSTOMERテーブルのC_PHONE列の後にC_ADD列が追加された状態となっていることを確認できました。
6. ワークテーブルをDROP
不要になったワークテーブルをDROPすれば、列の追加作業は完了です。
1 2 |
dbadmin=> drop table CUSTOMER_WK cascade; DROP TABLE |