我使用的数据库是Informix,版本是9.4。
我有一个场景,我试图将一些特定的记录从一个数据库迁移到另一个数据库。下面是我想做的一个例子。
比方说,我在数据库D1中有三张表A、B、C。我需要把这三张表的一些记录复制到数据库D2中。
下面是A、B、C之间的关系。
我想从数据库D1中移动一些记录,具体条件是a1='某物'。 除了A,我还需要从B和C中复制与A直接相关(A<->B)或间接相关(A<->C通过B)的记录。
最简单可靠的复制数据的方法是什么?
顺便说一下。这是个一次性的工作,不是连续的工作。
从表面上看,如果要传输的数据量足够小,那么你可以使用。
BEGIN WORK;
INSERT INTO D2:A
SELECT * FROM A WHERE a1 = 'something';
INSERT INTO D2:B
SELECT B.* FROM B JOIN A ON B.a1 = A.a1
WHERE A.a1 = 'something';
INSERT INTO D2:C
SELECT C.*
FROM C
JOIN B ON C.b1 = B.b1
JOIN A ON B.a1 = A.a1
WHERE A.a1 = 'something';
COMMIT WORK;
也许可以简化事情,如果条件是: A
其实就这么简单 a1 = 'something'
因此,只有一条来自 A
调(因为 a1
是主键的 A
).
BEGIN WORK;
INSERT INTO D2:A
SELECT * FROM A WHERE A.a1 = 'something';
INSERT INTO D2:B SELECT B.* FROM B
WHERE B.a1 = 'something';
INSERT INTO D2:C
SELECT C.*
FROM C
JOIN B ON C.b1 = B.b1
WHERE B.a1 = 'something';
COMMIT WORK;
这就避免了连接回表 A
.
如果数据量大,这样做是荒谬的,你可能会陷入卸载和重新加载数据这样的事情。 你最好在卸载表的时候将表锁定在共享模式下。
什么样的数据量让三插操作变得很荒谬? 这很难回答,但如果传输的数据所需要的逻辑日志空间比你在服务器上运行的 D2
,那么你就有问题了。 那么到底是拆分交易最好,还是选择unloadreload,很难决定。 总的来说,如果需要的空间太大,unloadreload可能更好。