DB2 reorg

在對錶進行了alter以後。再執行任何操作都報 不可用,錯誤碼爲7,百度了一下發現問題所在。一下轉自一篇博文:

ALTER TABLE操作在日常開發中很常見,下面是摘自DB2官網關於ALTER TABLE操作的一段話。

Perhaps the most important thing to realize when running an ALTER TABLE statement containing a REORG-recommended operation is that once the ALTER TABLE statement has executed, the table will be placed in the Reorg Pending state. This means that the table is inaccessible for almost all operations until you perform a REORG. See the ALTER TABLE statement in the SQL Referencefor the complete list of ALTER TABLE operations, some of which are also called REORG-recommended operations.

簡單地說就是運行ALTER TABLE時要注意當前運行的語句是否需要執行REORG操作,對於這樣的ALTER TABLE語句,如果不執行REORG操作的話,基本上目標表就不再可用。至於什麼樣的語句需要REORG,什麼樣的不需要,看SQL Reference去!下面是一個具體的例子演示:

CREATE TABLE my_test AS (
    SELECT id,
       ...
       sla_priority1_time,
       sla_priority2_time,
       sla_priority3_time,
       sla_priority4_time, 
       CAST(NULL AS DECIMAL(11, 2)) AS approvedDouAmount,
       CAST(NULL AS DECIMAL(4)) AS year
      FROM fin_attributes
)
WITH NO DATA;

ALTER TABLE my_test ALTER COLUMN id SET GENERATED ALWAYS AS IDENTITY;
ALTER TABLE my_test ADD COLUMN datetime TIMESTAMP NOT NULL GENERATED BY DEFAULT FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP;

ALTER TABLE my_test ALTER COLUMN sla_priority1_time DROP NOT NULL;
ALTER TABLE my_test ALTER COLUMN sla_priority2_time DROP NOT NULL;
ALTER TABLE my_test ALTER COLUMN sla_priority3_time DROP NOT NULL;

REORG TABLE my_test;

ALTER TABLE my_test ALTER COLUMN sla_priority4_time DROP NOT NULL;

REORG TABLE my_test;

INSERT INTO my_test (
       ...
       sla_priority1_time,
       sla_priority2_time,
       sla_priority3_time,
       sla_priority4_time, 
       approvedDouAmount,
       year
)
SELECT ...
       sla_priority1_time,
       sla_priority2_time,
       sla_priority3_time,
       sla_priority4_time, 
       NVL(pg.approvedDouAmount, 0),
       YEAR(NOW())
  FROM fin_attributes f, projgrp pg
 WHERE f.projgrp_id = pg.id
   AND f.project_id IS NULL
   AND f.fin_projgrp_id IS NULL
 UNION
SELECT ...
       sla_priority1_time,
       sla_priority2_time,
       sla_priority3_time,
       sla_priority4_time, 
       NVL(p.approvedDouAmount, 0),
       YEAR(NOW())
  FROM fin_attributes f, project p
 WHERE f.project_id = p.id
   AND f.projgrp_id IS NULL;

代碼有四種顏色,綠色代表不需要執行REORG的語句,紅色代表需要執行REORG的語句,黃色是REORG語句,白色你懂的。從代碼上可以看出,紅色高亮語句雖然要求使用REORG,但不及時運行REORG還可以讓後續的幾個語句繼續執行。原因是DB2允許最多三條語句處於Reorg Pending狀態,假如去除第一個REORG,語句“ALTER TABLE my_test ALTER COLUMN sla_priority4_time DROP NOT NULL;”就會執行失敗。

結論:如果不確定那個是需要REORG哪個是不需要REORG,索性都用上REORG;雖然在允許有三條語句處於Reorg Pending狀態,但最好每條ALTER TABLE對應一個REORG,因爲處於Reorg Pending狀態的表有可能會阻礙後續操作,具體詳情請參考文檔:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/c0023297.htm

PS:REORG TABLE本身是DB2的command,不是正常的SQL語句(Statement)。如果在非命令行環境中想使用REORG的話,可以像下面那樣調用存儲過程間接執行REORG操作,執行前確保你所使用的帳號有調用這個存儲過程的權限:

CALL SYSPROC.ADMIN_CMD('reorg table my_test')

最後來一段用Java動態執行SQL語句或DB2命令的代碼。


原文地址:http://blog.csdn.net/rcom10002/article/details/6387480


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章