在Sql Server中迁移此数据的最有效方法是什么?

时间:2010-12-07 15:34:45

标签: sql performance sql-server-2008 migration

这是我们当前的表格

CREATE TABLE Visitor
(
   VisitorID  bigint,
   DayPhone   varchar(50),
   NightPhone varchar(50)
)

我想将此数据迁移到单独的表中:

CREATE TABLE VisitorPhone
(
   VisitorID      bigint,
   Label          varchar(50), --Day, Night, Work, Cell, etc.
   Phone          varchar(50)
)

我的想法是最有效的方法:

INSERT INTO VisitorPhone(VisitorID, Label, Phone)
SELECT VisitorID, 'day', DayPhone FROM dbo.Visitor WHERE DayPhone IS NOT NULL AND DayPhone <> ''

INSERT INTO VisitorPhone(VisitorID, Label, Phone)
SELECT VisitorID, 'night', NightPhone FROM dbo.Visitor WHERE NightPhone IS NOT NULL AND NightPhone <> ''

我的其他选择是什么?我们已经讨论过Sql CLR函数,Temp Tables,ADO.NET等所有内容。真正最有效的方法是什么?请记住,DayPhone和NightPhone不是索引的一部分,而且我有16MM +访客记录,相当于~16MM之间 - ~32MM VisitorPhone记录。

1 个答案:

答案 0 :(得分:1)

我会按照您的建议完成迁移。问题是访问者行在VisitorPhone表中生成零行,一行或两行。如果它是Oracle,那么你将拥有“INSERT ALL”语法,让你做到这一点。也许SQL Server中有一些类似的语法?

任何程序方法都可能超越基于集合的方法。

你可以做一些复杂的事情,比如加入虚拟表并确定每个访问者行重复的次数(0 =没有电话,1有日/夜电话,2有两者)。然后,您将使用case-when逻辑来确定如何对行进行编码。

3000万行并不是一个比典型的开发笔记本电脑更大的数据。我认为找到并测试替代方法需要的时间比执行这两个语句要长。此外,您当前的解决方案很容易记录。

请务必在事后创建索引。