受信データを集計し、合計を Azure Storage テーブルに格納するワーカー ロールがあります。レポートのために、このデータを (指定された間隔で) SQL Server にパージ/コピーする必要があります。バッチで約1000行をパージしています。選択/挿入/更新を伴う単純なループには時間がかかります。
これを最も効果的に行う方法はありますか?ありがとう!
受信データを集計し、合計を Azure Storage テーブルに格納するワーカー ロールがあります。レポートのために、このデータを (指定された間隔で) SQL Server にパージ/コピーする必要があります。バッチで約1000行をパージしています。選択/挿入/更新を伴う単純なループには時間がかかります。
これを最も効果的に行う方法はありますか?ありがとう!
すべてのデータは明確に定義されたパーティションにありますか?たとえば、パーティションキー「A」に1000個のエンティティがあり、パーティションキー「B」に1000個のエンティティがあります。その場合、特定のパーティションからすべてのレコードを選択できるはずです。レコードの数によっては、継続トークンを処理する必要がある場合があります(リクエストごとに最大数を取得し、継続トークンを使用して残りのレコードを取得することしかできません)。
パーティションキーを使用することも、(トランザクションで)バッチを更新するための良い方法である可能性があります。
最初に最も簡単な部分をカバーします。ATSからのデータをメモリに保存したら、SqlBulkCopyを使用して多数の行をSQLサーバーに非常にすばやく挿入できます(BCPと同様に機能しますが、.NETから)。
さて、最も難しい部分は、ATSからデータをすばやく取得することです。私はあなたのPkey/Rkeyスキーマについて何も知りません。ただし、考慮すべき点がいくつかあります。
1)単一のPartitionKeyとRowKeyの範囲を使用してATSに対してクエリを実行するのが最も高速です。クエリにRowKeyの条件が含まれていない場合、1000行未満でPartitionKeyが指定されている場合でも、継続トークンでヒットする可能性があります
2)ATSから大量のデータを取得する必要があり、作業を個別のパフォーマンスの高いクエリの束に分割できる場合は、クエリをキューメッセージに分散してから、複数のプロセッサに各クエリを個別に並列処理させることを検討してください。
3)パージは興味深いかもしれません。バッチトランザクションを使用して一度に100個のエンティティをパージできるため、個々のクエリで許可されている場合は、データをSQLサーバーに処理した後、同じメモリ内エンティティを使用して、パーティションキーごとに一度に100個をパージできます(これは適度に高速になります)。または、可能であれば、テーブルを日付またはその他のキーでパーティション化された複数のテーブルに分割し、テーブルを一度に削除してデータを削除することもできます。たとえば、単一のOrdersテーブルではなく、SQLに移動する必要がある大きなOrdersテーブルがある場合は、毎月のOrdersテーブルを作成します:Orders201301..thru..Orders2xxx_12 ...そして、1か月の注文をインポートしたら、 1つのコマンドでそのテーブルを強制終了するだけです(非常に迅速に機能します)。
すべてのデータをローカルにダウンロードしてから、それらを SQL に挿入してみてください。
私は1か月以上前に同様のソリューションを探していましたが、最速の方法は自分のコードを使用することであることがわかりました-テーブルストレージからバッチで読み取り、SQLに挿入します. 役に立ったことの 1 つは、SQL インポート テーブルに PartitionKey + RowKey を一時的に記録することでした。これにより、インポートが失敗したときに、最後に成功した位置から安全に再起動できました。
RedGateなどには、テーブルストレージからすべてのデータを取得できるツールがいくつかありますが、私の知る限り、SQLではなくファイルにダンプします。