6

DB2 連合データベース (リモート・サーバーとニックネームに基づく) では、モデルをクリーンアップして別のデータベースから再作成する必要があります。これらのサーバーとニックネームを除くすべてのデータベース オブジェクトを削除する必要があります。

SYSCAT スキーマからオブジェクトのリストを取得する方法を知っています。ここで、それぞれに対して DROP ステートメントを実行する必要があります。明らかに、依存関係が邪魔になります。

ブルート フォース アプローチは、すべてが成功するまで DROP をループで実行することですが、順序 (運の良し悪し) によっては、非常に長い時間がかかる場合があります。

削除の合計時間が最短になるように、DROP ステートメントを効率的に並べ替える方法をご存知ですか?

完全な解決策は期待されていません。適度に賢い解決策で十分です。

ありがとうございました

4

3 に答える 3

2

各テーブルの参照 ( http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/syscat.referencesに従って行うことができます) を確認し、依存関係のツリーを自分で作成することをお勧めします (たとえば、SQL のみに制限されている場合は、一時テーブルを使用して実行できるはずです)。その後、そのツリーの下からドロップすることができます。

したがって、基本的に、あなたの質問に対する私の答えは、すばやく行うために、削除する前にテーブル間の参照に基づいてテーブルを並べ替えるということです。依存関係のサイクルがあってはならないため、参照されていないテーブルを常に 1 つ選択できる必要があります。落として繰り返す。

次の (同様の?) 質問もご覧になることをお勧めします: DB2 カスケード削除コマンド? 最初にデータを削除したい場合。

ある時点で間違っている場合は、修正してください。この回答は、他のデータベースでの私の経験に基づいているため、DB2 には完全に適していない可能性があります。それは動作するはずですが;)

于 2011-05-24T10:58:15.400 に答える
1

このクエリは、依存する要素の総数に従ってステートメントを並べ替えることができます。結果として得られる順序は、ほとんど問題なく機能します。「ブルート フォース」アプローチの 2 番目のパスには、(削除する数千のオブジェクトのうち) ほんの一握りのオブジェクトしか含まれていません。

問題、それは非常に遅いです...

EDIT :クエリにタイプミスがあり、多かれ少なかれ正しいデータが返されましたが、非常に遅くなりました。

WITH FIRST_LEVEL_DEPENDENCIES (BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.TABDEP T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.ROUTINESCHEMA AS BSCHEMA, T1.SPECIFICNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.ROUTINEDEP T1
   WHERE T1.ROUTINESCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, 'T', T1.REFTABSCHEMA, T1.REFTABNAME
    FROM SYSCAT.REFERENCES T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
),
RECURSIVE_DEPENDENCIES (LEVEL, BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
   SELECT 1, U.BSCHEMA, U.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM FIRST_LEVEL_DEPENDENCIES AS U
    UNION ALL
   SELECT LEVEL + 1, REC.BSCHEMA, REC.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM RECURSIVE_DEPENDENCIES REC,
          FIRST_LEVEL_DEPENDENCIES U
    WHERE LEVEL < 6
      AND U.BSCHEMA = REC.DSCHEMA
      AND U.BNAME = REC.DNAME
)
SELECT BSCHEMA, BNAME, COUNT(*)
  FROM RECURSIVE_DEPENDENCIES
 GROUP BY BSCHEMA, BNAME
 ORDER BY COUNT(*)
于 2011-05-24T12:44:14.770 に答える
0

私はDB2の直接的な解決策を持っていませんが、次のことを提案できます。

A)Microsoft SQL Server 2008では、次のリンクで、外部キーの順序に関するテーブルをDELETE(DROPではなく)する問題が解決されました。

SQL 2008で外部キー関係から削除ステートメントを生成しますか?

B)Oracle PL / SQLでは、次のリンクで、外部キーの順序を尊重してDELETE(DROPではない)する問題が解決されました。

テーブルのFKリレーションに基づいて、PL / SQLでDELETEステートメントを生成するにはどうすればよいですか?

DB2のソリューションを入手するために、これら2つのスクリプトのいずれかを調整できると思います。

同意しますか?

編集1:このリンクで:

http://bytes.com/topic/db2/answers/183189-how-delete-tables-completely

私は読むことができます:

ロバート、どうして

LOAD FROM /dev/null of del replace into tablename NONRECOVERABLE

-これにより、テーブルが非常に迅速に切り捨てられます。デフォルトでスペース更新統計を再利用するかどうかはわかりませんか?これには、正しいRI順序で削除を実行する必要がないという追加の利点があります。(後でSET INTEGRITYを実行する必要がありますが)OK

編集2:以下を参照してください:

スキーマとそのすべてのコンテンツをDB28.xにドロップする

于 2011-05-24T11:13:32.517 に答える