2017-09-01 16 views
0

私は、オンプレミスアプリケーションをAzureに移動する必要があるプロジェクトで作業しています。我々は約150,000レコードをWebアプリケーション(MVC App)に転送するアップロードユーティリティを持っています。残念ながら、Azureに移行した後、タイムアウトの問題が発生していました。 SqlCommandの代わりにSqlBulkCopyとストアプロシージャを使用するなどいくつかの変更を行いました。今、タイムアウトの問題は解決されましたが、Azureのテーブルに15万レコードをアップロードするには、データのアップロードに約5分かかります。AzureのSQLバルクコピー速度を向上

私はAzureで試用版を使用していますが、私のデータベースDTUは20です。今はコストのために20にしておきたいと思います。私は私が働いている小さな予算を持っています。データベースサイズは問題ではありません。私はクォータのかなり下です。

どのようにこれらの150,000レコードを挿入する時間を短縮することができますか?

コードサンプルFYI

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection)) 
        { 
         bulkCopy.BulkCopyTimeout = 0; 
         bulkCopy.BatchSize = 10000; 
         bulkCopy.ColumnMappings.Add("Barcode", "Barcode"); 
         bulkCopy.ColumnMappings.Add("SubCategory", "SubCategory"); 
         bulkCopy.ColumnMappings.Add("ItemDescription", "ItemDescription"); 
         bulkCopy.ColumnMappings.Add("CreateDate", "CreateDate"); 
         bulkCopy.ColumnMappings.Add("RevisedDate", "RevisedDate"); 

         bulkCopy.DestinationTableName = "Items"; 
         try 
         { 
          bulkCopy.WriteToServer(dtTblData); 
          destinationConnection.Close(); 
         } 
         catch (Exception ex) 
         { 
          this.Logs.Add(DateTime.Now.ToString() + ": " + ex.Message); 
         } 
        } 
       } 

:挿入操作時には、私のデータベースのDTUが100%に達します。

+1

150Kを一度にアップロードする必要がありますか?個別のデータテーブルとして、またはBatchSizeプロパティを使用して、それぞれ10K行のバッチを送信してみてください。可能であれば、ターゲット表の索引数を減らし、クラスタード・インデックス順にロードします。 –

+0

私はbatchSizeを10Kに設定しました。私がデータベースで見ているものから、PKにのみインデックスがあります。あなたの返信ありがとう –

+0

ソースデータはPKによって注文されていますか? –

答えて

0

オプションSqlBulkCopyOptions.TableLockを使用すると、パフォーマンスが向上します。

テーブルをロックすることができれば、間違いなく使用する必要があります。この構成の外

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.TableLock)) 
{ 
    // ...code... 
} 

すでにSqlBulkCopyを使用するので、あなたがすることができるものの多くはありません。ボトルネックは、予算のためにアップグレードできないデータベースパフォーマンスです。

+0

ありがとうございます。私はその応答に感謝します。 –

0

Jonathanが述べたテーブルロックのほかに、パフォーマンスを向上させる唯一の本当の方法は、サービスのDTUを増やすことです。

ただし、この大量の負荷がまれな操作である場合は、一時的にデータベースのDTUを上げて負荷をかけてから、DTUを下げることができます。あなたは実際にアップロードしている時間の間、より高いレートでのみ請求されます。

あなたは、あなたがS2まで移動することができMicrosoft.Azure.Management.Sql.DatabasesOperationsExtensionsクラスにAzure SDKや関数を使用して、あなたが今、S1の目的がある上にあるa higher tier objective(20のDTUのでRequestedServiceObjectiveId値を設定するコードを経由してデータベースを変更することができます(50 DTU)を更新機能に渡すDatabaseオブジェクトに追加します。

+0

注目。弾性プールも同じことをするのでしょうか、あるいはあなたのソリューションはよりコントロールできますか?再度、感謝します。 –

+0

エレガントプールは、複数のデータベースを持ち、1つのDTU料金を支払ってもDTUを多くのデータベースで共有できる場合にのみ便利です。必要に応じて停止します。 –

+0

よろしくお願いします...ありがとうございます。 –

関連する問題