データウェアハウスの作成に使用できるC#.NETシステムを構築しました。このシステムは、選択されたデータベースを取得し、これらのデータベースに対してスクリプトを実行して、結合されたデータベース/ウェアハウスを作成します。
現在、3つのデータベースを1つのデータベースにコンパイルし、それぞれから2つのテーブルをコピーしています(テーブル[XI]とテーブル[XII]-これらは1対多の関係にありますが、コピー/ 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
また、スペースと大部分が冗長になるという事実のために、すべての列を表示していないことにも注意してください。
編集1。
1.データベースは同じサーバー上にあります。
2.ログを含むデータベースファイルは、同じドライブの同じディレクトリにあります。
3.この時点では、ソースデータベース(DatabaseA / B / C)またはデータウェアハウスデータベースにプライマリ/外部キーまたは制約が設定されていませんINSERT INTO
。
編集2。上記のクエリをManagementStudioで実行しましたが、5秒かかりました!?
編集3。CLUSTERED INDEX
これがこのクエリに役立つことを期待して一時的なものを追加しましたが、これも役に立ちませんでした。