2016-02-04 30 views
0

我正在将数据文件加载到临时表,该临时表工作得很好,但之后我需要将最终表转换为多个数据类型,并且插入语句对于大表而言变得不可行。 这些陈述是由我的工具创建的,我想优化这部分。 插入语句看起来像这样,但有更多的列,有效性检查和一些在这些转换器内需要替换。将数据从临时表转换为最终表

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进入临时表和文件真的很大。

+0

什么是具有不同的数据类型 – TheGameiswar

+1

两个相同的表中的数据我从源获得需要的是真的搞砸了很多方面(即在数字上有“ - ”的第一个位置或最后一个,textqualifier,需要被原始字符替换的转义字符......),所以我认为把搞砸的数据放入临时表和“清理”到最终表后将比源数据上的I/O操作更有效。 – McNade

+0

你可以在临时表上有一个触发器,它可以像上面那样转换数据,并且每次插入记录时都可以插入到最终表中 – TheGameiswar

回答

0

几个简单的想法,因为没有一个正确答案在这里:

  1. 将数据加载到临时
  2. 清洁/复制到第二个临时表使用 所需的数据类型定义的转换。良好的数据复制,留下不好的数据背后
  3. 复制数据从“干净”表“活”表

对于从表中的数据复制到表,或许是最快的选项是使用表分区。这可能会变得复杂,你需要阅读这个概念,并确定它是否适用于你的数据。 (另外,你需要SQL Server企业版。)

另一种方法是将被复制的数据“块化”,将其分解成10,000个行或一些类似的任意数量的集合(循环)你完成了。这可以使用TOP N语法来完成,根据加载的数据计算日期或键范围,或者甚至可以使用row_number()

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

+0

非常感谢!我可以提高性能,因为我使用[此解决方案]的改变版本“数据块化”数据(http://stackoverflow.com/questions/864341/move-sql-server-data-in-limited-1000-row -chunks/865826#865826)。 – McNade