我們已經構建了一個可用於創建數據倉庫的C#.NET系統。該系統採用選定的數據庫並針對這些數據庫運行腳本以創建組合的數據庫/倉庫。動態SQL INSERT比它應該的時間長30倍
現在,我有三個數據庫被編譯到一個數據庫中,我從每個表(表[XI]和表[XII])複製兩個表 - 它們有一對多的關係,但沒有設置約束在複製/ INSERT INTO
時)。要運行腳本的數字以及每個表的相關大小如下:
執行的腳本由30個SQL查詢組成。
DatabaseA:
Table [XI] 29,026 Rows (size 20,128Kb). Table [XII] 531,958 Rows (size 50,168Kb). Time taken for entire script: 1.51s.
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倍的時間!
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
,希望這可以幫助這個查詢,這也沒有幫助。
爲什麼使用兩級動態查詢?我認爲只有一個執行就足夠了。你有什麼特別的理由嗎? –
您是否試圖獲得@SQL的價值並親自執行以查看需要多少時間? – PraveenVenu
我願意。這個腳本被預編譯成一個SQL查詢的數據庫......實際上現在看它,我認爲我的理由現在已經消失了,我可以將動態SQL級別降低。但是,這不是我的問題的原因。謝謝你的時間。 – MoonKnight