2012-09-24 26 views
0

我們已經構建了一個可用於創建數據倉庫的C#.NET系統。該系統採用選定的數據庫並針對這些數據庫運行腳本以創建組合的數據庫/倉庫。動態SQL INSERT比它應該的時間長30倍

現在,我有三個數據庫被編譯到一個數據庫中,我從每個表(表[XI]和表[XII])複製兩個表 - 它們有一對多的關係,但沒有設置約束在複製/ INSERT INTO時)。要運行腳本的數字以及每個表的相關大小如下:

執行的腳本由30個SQL查詢組成。

  1. DatabaseA

    Table [XI] 29,026 Rows (size 20,128Kb). 
    Table [XII] 531,958 Rows (size 50,168Kb). 
    Time taken for entire script: 1.51s. 
    
  2. DatabaseB

    Table [XI] 117,877 Rows (size 17,000Kb). 
    Table [XII] 4,000,443 Rows (size 512,824Kb). 
    Time taken for entire script: 2.04s. 
    

這些都運行正常和快速。下一個尺寸與第一個尺寸幾乎完全相同,但需要40倍的時間!

  1. DatabaseC

    Table [XI] 29,543 Rows (size 20,880Kb). 
    Table [XII] 538,302 Rows (size 68,000Kb). 
    Time taken for entire script: 44.38s. 
    

這是爲什麼要花這麼長時間我不能工作了。我已經使用了SQL Server Profiler和性能監視器,但我無法確定這種性能巨大變化的原因。

用於執行更新的查詢是動態的,並顯示在此問題的底部 - 由於顯式引用了所需的列,因此它很大。我的問題是;什麼可能導致這種執行時間的過度增加?

任何線索將不勝感激。

SQL:

DECLARE @DbName NVARCHAR(128); 
SET @DbName = (SELECT TOP 1 [DbName] 
       FROM [IPACostAdmin]..[TmpSpecialOptions]); 
DECLARE @FilterSql NVARCHAR(MAX); 
SET @FilterSql = (SELECT TOP 1 [AdditionalSQL] 
        FROM [IPACostAdmin]..[TmpSpecialOptions]); 
DECLARE @SQL NVARCHAR(MAX); 
DECLARE @SQL1 NVARCHAR(MAX); 
DECLARE @SQL2 NVARCHAR(MAX); 
SET @SQL1 = 
    'INSERT INTO [' + @DbName + ']..[Episode] 
     ([Fields1], ..., [FieldN])'; 
SET @SQL2 = 
'SELECT 
    [Fields1], ..., [FieldN] 
FROM [B1A] ' + @FilterSql + ';'; 
SET @SQL = @SQL1 + @SQL2; 
EXEC(@SQL); 
GO 

注:我分割動態SQL爲@SQL1@SQL2的清晰度。還請注意,由於空間原因,我沒有顯示所有列,而且它在很大程度上是多餘的。

Edit1。

1.數據庫位於同一臺服務器上。

2.數據庫文件,包括日誌都在同一驅動器上同一目錄下。

3.在此INSERT INTO時,在源數據庫(DatabaseA/B/C)或數據倉庫數據庫上沒有設置主鍵/限制鍵或約束。

Edit2。我在管理工作室中運行了上述查詢,並花了5秒鐘!

Edit3。我已經添加了一個臨時的CLUSTERED INDEX,希望這可以幫助這個查詢,這也沒有幫助。

+2

爲什麼使用兩級動態查詢?我認爲只有一個執行就足夠了。你有什麼特別的理由嗎? –

+0

您是否試圖獲得@SQL的價值並親自執行以查看需要多少時間? – PraveenVenu

+0

我願意。這個腳本被預編譯成一個SQL查詢的數據庫......實際上現在看它,我認爲我的理由現在已經消失了,我可以將動態SQL級別降低。但是,這不是我的問題的原因。謝謝你的時間。 – MoonKnight

回答

0

這是由DELETE查詢在前一個CREATE CLUSTERED INDEX查詢有時間更新整個表之前運行引起的。解決方案是使用BEGIN TRANSACTIONCOMMIT關鍵字。這迫使SQL Server在之前完成索引,以解決其他操作。

請注意,只有在使用修改現有tabel的動態SQL語句執行CREATE CLUSTERED INDEX查詢後纔會出現此問題。

我希望這可以幫助別人。

1

一些信息將是巨大的知道:

1:數據庫是在同一臺服務器上?

2:在A和C的情況下,db文件和日誌文件在同一個驅動器上?

(有一次,我有兩個數據庫有問題,其中一人是一個SSD驅動器,另一個在HDD上這是讀取數據的問題。)

3:DB統計約不成? (表沒有約束,但是索引被定義?)

+0

謝謝。請參閱我編輯的問題... – MoonKnight

+0

啊,我正在運行SSD和1TB外部HD。但是,所有被訪問的數據庫都在HD上......這也發生在不同的機器上 - 具有不同的配置,所以我懷疑這是數據問題,但我不知道如何進展。 – MoonKnight

相關問題