将数据从登台表转换为最终表

时间:2016-02-04 13:09:35

标签: sql-server staging

我正在将数据文件加载到一个完美正常的临时表中,但之后我需要为最终表转换为几种数据类型,并且insert语句对大表不可行。 这些陈述是由我的工具创建的,我想优化这部分。 插入语句看起来像这样,但有更多的列,有效性检查和这些转换中的一些必要的替换。

INSERT INTO foo
SELECT
convert(decimal(10,2),col1),
convert(date, col2),
convert(decimal(10,2),col3),
convert(int, col4),
convert(decimal(10,2),col5)
...
from foo_staging

在小桌子上,这种方法非常快,但随着桌子变大,性能变得非常糟糕。任何想法如何提高转换的性能?

  编辑:我正在使用Bulkinsert进入临时表,文件非常大。

1 个答案:

答案 0 :(得分:0)

一些敏捷的想法,因为这里没有人正确答案:

  1. 将数据加载到暂存
  2. 通过复制到使用。定义的第二个临时表来清理/转换 所需的数据类型。复制好的数据,遗留下来的坏数据
  3. 将数据从“干净”表格复制到“实时”表格
  4. 对于从表到表复制数据,最快的选择可能是使用表分区。这可能变得复杂,您需要阅读概念并确定它是否适用于您的数据。 (另外,您需要SQL Server企业版。)

    另一种方法是将所复制的数据“chunkify”,将其分成(例如)10,000行或类似任意数量的数据,然后循环直到完成。这可以使用TOP N语法完成,根据加载的数据计算日期或键范围,或者甚至可以使用row_number()

    (再次注意,这些功能的可用性取决于您使用的SQL的版本/版本。)