大表选择和插入

时间:2015-03-27 22:14:27

标签: sql-server sql-insert

我找不到任何可以解决这个问题的事情,尽管我发现很多事情似乎指向了正确的方向。

我有一张包含约470万条记录的表格。该表还有~319列。在所有这些~319列中,有16个我感兴趣,我想将它们放入另一个只有2列的表中。现在基本上如何设置是“A”列只是一个ID而列1-15是代码。没有列被分组(不确定是否重要)。

我尝试过这样的事情:

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 > ''

...
...
...

编辑:我忘了ProCodeX的大多数列都是空白的。所有ProCode1行都被占用,但每次增加的指数都会小于指数(例如ProCode2 <50%占用,ProCode3 <10%占用

1 个答案:

答案 0 :(得分:0)

使用Cross ApplyTable 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查询快得多,因为这将执行单个物理表命中。