AzureでSQLの一括コピー速度を上げる

azure c# sqlbulkcopy sql-server

質問

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

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

これら150,000レコードを挿入する時間をどのように減らすことができるかについての提案はありますか?

コードサンプル

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);
                        }
                    }
                }

FYI:挿入操作中に、私のデータベースのDTUが100%に達しました。

エキスパート回答

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

したがって、テーブルをロックすることができれば、間違いなくそれを使用する必要があります。

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

この構成の外では、既にSqlBulkCopyを使用しているので、たくさんのことができます。ボトルネックは、予算のためにアップグレードできないデータベースパフォーマンスです。


人気のある回答

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

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

Azure SDKMicrosoft.Azure.Management.Sql.DatabasesOperationsExtensionsクラスの関数を使用してコードを使用してデータベースを変更し、上位層の目的で RequestedServiceObjectiveId値を設定することができます(今は20個のDTUがS1目的です更新機能に渡すDatabaseオブジェクトに対して、バルクロード中にS2(最大50個のDTU)に移動する可能性があります。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ