0

データウェアハウスの作成に使用できるC#.NETシステムを構築しました。このシステムは、選択されたデータベースを取得し、これらのデータベースに対してスクリプトを実行して、結合されたデータベース/ウェアハウスを作成します。

現在、3つのデータベースを1つのデータベースにコンパイルし、それぞれから2つのテーブルをコピーしています(テーブル[XI]とテーブル[XII]-これらは1対多の関係にありますが、コピー/ 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また、スペースと大部分が冗長になるという事実のために、すべての列を表示していないことにも注意してください。

編集1。

1.データベースは同じサーバー上にあります。

2.ログを含むデータベースファイルは、同じドライブの同じディレクトリにあります。

3.この時点では、ソースデータベース(DatabaseA / B / C)またはデータウェアハウスデータベースにプライマリ/外部キーまたは制約が設定されていませんINSERT INTO

編集2。上記のクエリをManagementStudioで実行しましたが、5秒かかりました!?

編集3。CLUSTERED INDEXこれがこのクエリに役立つことを期待して一時的なものを追加しましたが、これも役に立ちませんでした。

4

2 に答える 2

1

知っておくと便利な情報がいくつかあります。

1:データベースは同じサーバー上にありますか?

2:AとCの場合、dbファイルとlogfileは同じドライブにありますか?

(1つがSSDドライブにあり、もう1つがHDDにある2つのデータベースで問題が発生したことがあります。これは、データの読み取りの問題でした)

3:断片化に関するDB統計?(テーブルには制約はありませんが、インデックスは定義されていますか?)

于 2012-09-24T10:14:41.653 に答える
0

これは、前のクエリがテーブル全体を更新する時間がDELETEなくなる前にクエリが実行されたことが原因でした。解決策は、 andキーワードCREATE CLUSTERED INDEXを使用することでした。これにより、SQL Serverは、他の操作を実行する前にインデックス作成を終了します。BEGIN TRANSACTIONCOMMIT

この問題はCREATE CLUSTERED INDEX、既存のテーブルを変更する動的SQLステートメントを使用してクエリを実行した場合にのみ発生する可能性があることに注意してください。

これが他の誰かに役立つことを願っています。

于 2012-10-04T10:42:20.733 に答える