1

我有大约 15 个表,每个表大约有 10 列和近 100 万行数据。

所有 15 个表都有相同的主键,我可以用来连接它们。

例如..
表 1 - 列 ABCDE
表 2 - 列 ABFGH
表 3 - 列 ABIJK
表 4 - 列 ABLMN
等。其中 A 和 B 是主键

我需要一张看起来像这样的大表..
mainTable - 列 ABCDEFG ... MN

现在,我所做的是:
- 从表 1 作为我的“主”表开始
- 更改表以添加所有列..(即 FGH .. LMN)
- 使用 UPDATE 命令填写“主”表“ 桌子

update mainTable set 
 F = a.F,
 G = a.G,
 H = a.H
from mainTable left join Table2 a on
mainTable.A = a.A  and 
mainTable.B = a.B 

(rinse and repeat for each of the 15 tables)

这似乎有效,只是它的效率非常低。加入一张桌子需要很长时间..

是否有替代/更快的方法来执行此任务?

4

3 回答 3

1

我能想到的一种选择:

CREATE TABLE data
(
  A <some format> NOT NULL,
  B <some format> NOT NULL,
  C <some format> NOT NULL CONSTRAINT DF_data_C DEFAULT (' '),
  D <some format> NOT NULL CONSTRAINT DF_data_D DEFAULT (' '),
  ...
  N <some format> NOT NULL CONSTRAINT DF_data_N DEFAUT (' ')
)

对,现在您有一个包含所有必要列的表。由于插入不会相互干扰,只需将所有导入数据插入到大表中即可。要检查的一件事是空间,因为该表最后必然很大,有数百万行。

然后使用 GROUP BY 子句将数据从表数据“移动”到主表:INSERT INTo main SELECT A, B, Max(C), Max(D), Max(E), Max(F).. . Max(N) FROM data GROUP BY A, B

现在这可能是一种资源消耗,但仍可能比更新执行得更快。它背后的想法是加快数据收集过程,然后当所有数据都在一个地方时,将数据正确地移动到一起。由于其他列默认为空白(或一个空格),因此 Max 函数将从实际导入的任何列中获取数据。

于 2012-04-17T10:45:43.077 回答
0

更新通常比插入慢。而是创建一个新表并将所有数据插入其中。

于 2012-04-17T10:35:38.713 回答
0

您可以像这样使用 select into:

    SELECT 
        T1.A, T1.B, T1.C,
        T2.D, T2.E, T2.F,
        T3.G, T3.H
    INTO NewTable 
    FROM 
      T1 
      inner join T2 on T1.A = T2.A and T1.B = T2.B
      inner join T3 on T1.A = T3.A and T1.B = T3.B
            ORDE BY A,B -- If this will become your PK

然后你只需要改变表来添加所需的索引:

  ALTER TABLE NewTable ADD CONSTRAINT PK_NewTable PRIMARY KEY CLUSTERED (A,B)

仅当所有表具有相同的 A、B 组合时,这才有效。如果这因表而异,则需要不同的解决方案:

    SELECT 
        T1.A, T1.B, T1.C,
        T2.D, T2.E, T2.F,
        T3.G, T3.H
    INTO NewTable 
    FROM
    (SELECT DISTINCT A,B FROM
     (SELECT A,B FROM T1
      UNION SELECT A,B FROM T2
      UNION SELECT A,B FROM T3) ALL) T0
      inner join T1 on T0.A = T1.A and T0.B = T1.B
      inner join T2 on T0.A = T2.A and T0.B = T2.B
      inner join T3 on T0.A = T3.A and T0.B = T3.B
于 2012-04-17T13:02:35.437 回答