DB2で列のサイズを変える
DB2でのVARCHAR型の列のサイズの変更は
ALTER TABLEの ALTER COLUMN で SET DATA TYPE VARCHARというのを使います。
書式は
http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000888.html
を参照してもらいたいですが
掻い摘んでしまえばこんな感じ
db2 "ALTER TABLE テーブル名 ALTER COLUMN カラム名(列名) SET DATA TYPE VARCHAR(変更したいサイズ)"
懸念することは、表が馬鹿デカくなっていたりすると
実行に時間がかかってしまうんじゃないかということ。。
もし、時間がかかってしまうのならサービスを停止して・・、、
と、考えただけでも苦痛です。。
手元になぜかやったらめったらデータが入っているサーバがあるので
このテスト環境でまずは試してみましょう。
検証:
レコード数を調べる
$ db2 "SELECT substr(TABNAME,1,40) as tablename, CARD FROM SYSCAT.TABLES where TABNAME='xxxxx' " TABLENAME CARD ---------------------------------------- -------------------- xxxxx 22556224
現状のテーブルスキーマ
$ db2 describe table xxxxx Data type Column Column name schema Data type name Length Scale Nulls ------------------------------- --------- ------------------- ---------- ----- ------ PATH1 SYSIBM VARCHAR 64 0 Yes PATH2 SYSIBM VARCHAR 64 0 Yes PATH3 SYSIBM VARCHAR 64 0 Yes
列名PATH3のサイズを変更(timeコマンド付で実行)
$ time db2 "ALTER TABLE xxxxx ALTER COLUMN PATH3 SET DATA TYPE VARCHAR(80)" DB20000I The SQL command completed successfully. real 0m0.109s user 0m0.002s sys 0m0.094s
一瞬で完了!
めがっさ早いにょろ(ww
変更後のテーブルスキーマ
$ db2 describe table xxxxx Data type Column Column name schema Data type name Length Scale Nulls ------------------------------- --------- ------------------- ---------- ----- ------ PATH1 SYSIBM VARCHAR 64 0 Yes PATH2 SYSIBM VARCHAR 64 0 Yes PATH3 SYSIBM VARCHAR 80 0 Yes
結論:
DB2 ALTER TABLE ALTER COLUMNでの変更に要する時間は列数には影響がない
ので、本番稼働中にやっちゃってもいいんじゃないかな〜