大 Table Select 并插入
Large Table Select and Insert
虽然我发现了很多似乎指向正确方向的东西,但我还没有找到真正解决这个问题的方法。
我有一个 table,里面有大约 470 万条记录。这个 table 也有 ~319 列。在所有这些 ~319 列中,有 16 列是我感兴趣的,我想将它们放入另一个只有 2 列的 table 中。现在基本上是如何设置的,第 "A" 列只是一个 ID,第 1-15 列是代码。 None 列被分组(不确定这是否重要)。
我试过类似的东西:
Insert Into NewTable(ID,Profession)
Select ID, ProCode1 From OriginalTable WHERE ProCode1 > ''
UNION
Select ID, ProCode2 From OriginalTable WHERE ProCode2 > ''
等等。这似乎根本没有做任何事情,我让它走了 ~ 20 分钟。
现在我可以得到一个小的结果做同样的事情但是放弃并集并使用 TOP (1000)
语句,但是即使那样也不会奏效。
所以问题是我能做些什么来接受这个:
ID|PID|blah|blah|blah|...|ProCode1|ProCode2|ProCode3|...|ProCode15|blah|...
进入:
ID|PID|ProCode|
在没有 运行 的所有约 470 万行中:
Insert Into NewTable(PID,ProCode)
select PID, ProCode1 FROM OriginalTable WHERE ProCode1 > ''
Insert Into NewTable(PID, ProCode)
select PID, ProCode2 FROM Original Table WHERE ProCode2 > ''
Insert Into New Table(PID, ProCode)
Select PID, ProCode3 FROM Original Table WHERE ProCode3 > ''
...
...
...
编辑:我忘记了 ProCode<em>X</em>
的大部分列都是空白的。所有 ProCode1
行都被占用,但每次增加都会呈指数级减少(例如 ProCode2
被占用 <50%,ProCode3
被占用 <10%)
使用 Cross Apply
和 Table valued constructor
来逆透视数据而不是使用不同的 UNION ALL
Insert Into NewTable(PID,ProCode)
select PID, ProCode FROM OriginalTable
Cross apply
(
values(ProCode1),(ProCode2),(ProCode3),..(ProCode15)
)
cs (ProCode)
Where ProCode <> ''
这将比 UNION ALL
查询快得多,因为这将进行单次物理 table 命中。
虽然我发现了很多似乎指向正确方向的东西,但我还没有找到真正解决这个问题的方法。
我有一个 table,里面有大约 470 万条记录。这个 table 也有 ~319 列。在所有这些 ~319 列中,有 16 列是我感兴趣的,我想将它们放入另一个只有 2 列的 table 中。现在基本上是如何设置的,第 "A" 列只是一个 ID,第 1-15 列是代码。 None 列被分组(不确定这是否重要)。
我试过类似的东西:
Insert Into NewTable(ID,Profession)
Select ID, ProCode1 From OriginalTable WHERE ProCode1 > ''
UNION
Select ID, ProCode2 From OriginalTable WHERE ProCode2 > ''
等等。这似乎根本没有做任何事情,我让它走了 ~ 20 分钟。
现在我可以得到一个小的结果做同样的事情但是放弃并集并使用 TOP (1000)
语句,但是即使那样也不会奏效。
所以问题是我能做些什么来接受这个:
ID|PID|blah|blah|blah|...|ProCode1|ProCode2|ProCode3|...|ProCode15|blah|...
进入:
ID|PID|ProCode|
在没有 运行 的所有约 470 万行中:
Insert Into NewTable(PID,ProCode)
select PID, ProCode1 FROM OriginalTable WHERE ProCode1 > ''
Insert Into NewTable(PID, ProCode)
select PID, ProCode2 FROM Original Table WHERE ProCode2 > ''
Insert Into New Table(PID, ProCode)
Select PID, ProCode3 FROM Original Table WHERE ProCode3 > ''
...
...
...
编辑:我忘记了 ProCode<em>X</em>
的大部分列都是空白的。所有 ProCode1
行都被占用,但每次增加都会呈指数级减少(例如 ProCode2
被占用 <50%,ProCode3
被占用 <10%)
使用 Cross Apply
和 Table valued constructor
来逆透视数据而不是使用不同的 UNION ALL
Insert Into NewTable(PID,ProCode)
select PID, ProCode FROM OriginalTable
Cross apply
(
values(ProCode1),(ProCode2),(ProCode3),..(ProCode15)
)
cs (ProCode)
Where ProCode <> ''
这将比 UNION ALL
查询快得多,因为这将进行单次物理 table 命中。