大 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 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 查询快得多,因为这将进行单次物理 table 命中。