这是我们当前的表格
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记录。
答案 0 :(得分:1)
我会按照您的建议完成迁移。问题是访问者行在VisitorPhone表中生成零行,一行或两行。如果它是Oracle,那么你将拥有“INSERT ALL”语法,让你做到这一点。也许SQL Server中有一些类似的语法?
任何程序方法都可能超越基于集合的方法。
你可以做一些复杂的事情,比如加入虚拟表并确定每个访问者行重复的次数(0 =没有电话,1有日/夜电话,2有两者)。然后,您将使用case-when逻辑来确定如何对行进行编码。
3000万行并不是一个比典型的开发笔记本电脑更大的数据。我认为找到并测试替代方法需要的时间比执行这两个语句要长。此外,您当前的解决方案很容易记录。
请务必在事后创建索引。