web-dev-qa-db-ja.com

1つの大きなテーブル専用のデータベースにバッファプールを作成する方法

データベース(DB2)に400KレコードのテーブルTICKETがあります。

応答を速くするために、この1つの大きなテーブルだけに専用の1つの巨大なバッファープールを作成したいと思います。それを行う手順は何ですか?

また、現時点では、データベース内のすべてのテーブル(約200)でテーブルスペース全体をカバーする1つのバッファープールがあります。次に、最初に作成された古いバッファプール内の特定のテーブルで何が起こりますか?そのテーブルは最初のバッファプールに留まるべきですか、それともそのバッファプールから削除するのですか?また、このアクションにはいくつかのリスクがありますか???

ありがとうございました

3
Dejan
  1. 新しいバッファプールを作成します。
  2. そのバッファプールに関連付けられている新しいテーブルスペースを作成します。
  3. 必要なテーブルのコピーを作成し、新しいテーブルスペースに配置します。
  4. 元のテーブルから新しいテーブルにデータをコピーします。
  5. 古いテーブルを削除します。

ALTER TABLESPACEステートメントを使用してテーブルスペースを異なるバッファプールに関連付けることができますが、テーブルは1つのテーブルスペースにのみ関連付けることができます。 ALTER TABLEを発行してテーブルスペースを切り替えることはできません。そのため、残念ながら新しいテーブルを作成し、データを一方から他方に移動する必要があります。

編集:また、古いテーブルに関連付けたインデックスも削除され、再作成する必要があることにも注意してください。

編集:コード例、4Kテーブルスペースを想定しています。必要に応じて、正しいサイズに置き換えてください(つまり、4、8、16、または32 K)。

db2 create bufferpool TICKET_BP immediate size 250 automatic pagesize 4k;
--note I list automatic storage here. We prefer to use that. Plus, IBM is pushing to move
-- in that direction. This TS is for the table.
db2 create large tablespace TICKETTS pagesize 4k managed by automatic storage bufferpool TICKET_BP;
--this TS is for indexes.
db2 create large tablespace TICKET_IND_TS pagesize 4k managed by automatic storage bufferpool TICKET_BP;
db2 create large tablespace TICKET_LOB_TS pagesize 4k managed by automatic storage bufferpool TICKET_BP;

-- now you can run the stored proc to move the data. It essentially does the same thing as what I specified above, except that it can move the data during normal work loads, so it should have less impact on locking and such, but it may take longer I'm guessing.
db2 "call syscproc.admin_move_table('MAX','TICKET','TICKETTS','TICKET_IND_TS','TICKET_LOB_TS','','','','','','MOVE');

そして、はい、間違いなく前後にバックアップを取ります。また、データ移動期間中にトランザクションを許可すると、ロールバックする必要がある場合にそれらのトランザクションが失われる可能性があることに注意してください。

2
Chris Aldrich