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)

これは機能しているように見えますが、恐ろしく非効率的です。1つのテーブルに参加するのに何年もかかります..

このタスクを実行する別の/より高速な方法はありますか?

4

3 に答える 3

1

私が考えることができる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 句を使用してテーブル データからテーブル main にデータを "移動" して終了します: INSERT INTo main SELECT A, B, Max(C), Max(D), Max(E), Max(F).. . Max(N) FROM データ GROUP BY A, B

現在、これはおそらくリソースを大量に消費していますが、それでも更新よりも高速に実行される可能性があります。その背後にある考え方は、データ収集プロセスを高速化し、すべてのデータが 1 つの場所にあるときにデータを正しく一緒に移動することです。他の列はデフォルトで空白 (または 1 つのスペース) であるため、Max 関数は実際にインポートされた列からデータを取得します。

于 2012-04-17T10:45:43.077 に答える
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 に答える
0

多くの場合、更新は挿入よりも遅くなります。代わりに、新しいテーブルを作成し、すべてのデータをそこに挿入します。

于 2012-04-17T10:35:38.713 に答える