2016-02-04 28 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