【问题标题】:What's the most efficient way to migrate this data in Sql Server?在 Sql Server 中迁移这些数据的最有效方法是什么?
【发布时间】:2010-12-07 15:34:44
【问题描述】:

这是我们当前的表格

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 函数、临时表、ADO.NET 等所有内容。真正最有效的方法是什么?请记住,DayPhone 和 NightPhone 不是索引的一部分,而且我有 16MM+ 的访问者记录,这相当于 ~16MM - ~32MM VisitorPhone 记录之间的某个位置。

【问题讨论】:

  • 为什么不用整数列而不是 varchar 标签?如果你有这么多的记录,一个 int 会更小更快……而 varchar(50) 用于电话号码?这不是有点悲观吗?
  • 我对如何存储数据的反馈不感兴趣,而是对如何迁移数据感兴趣。
  • 迁移数据有很多不同的方法,包括您提到的那些以及 SSIS。您可以分析所有这些并找到最佳方法,但我猜分析会比迁移花费更长的时间,我进一步猜测您上面显示的 INSERT 语句将是最快的方法。
  • SQL语句中的case语句,也许吧?
  • 您要求最有效的方法来执行此操作。如果选择错误的数据类型,您将无法获得最有效的方法。这就是我问的原因。否则您的查询几乎是最快的方式

标签: sql performance sql-server-2008 migration


【解决方案1】:

我会按照您的建议进行迁移。您的问题是访客行在 VisitorPhone 表中生成零、一或两行。如果是 Oracle,您将拥有“INSERT ALL”语法,让您可以做到这一点。 SQL Server 中是否有一些类似的语法可用?

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

您可以执行一些复杂的操作,例如加入虚拟表并确定每个访问者行将被复制多少次(0 = 没有电话,1 有白天/夜间电话,2 都有)。然后,您将使用 case-when 逻辑来确定如何对行进行编码。

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

请务必在之后创建索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2020-05-08
    • 2011-06-07
    • 2012-07-13
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多