0

コードの生成に使用する必要のあるデータを含むSQLServer2008データベースがあります(実際には、別のデータベースに別の構造を設定するために生成する必要のあるSQLスクリプトですが、誤解しないでください-これ基本的にデータに基づいてテキストの大きな塊を生成することについての質問です)。

パフォーマンスが気になります。したがって、一般的に言えば、

a)SQLServerのストアドプロシージャでコードを生成します。

長所:データをネットワーク上で移動する必要がないため、遅延の問題が少なくなります(ただし、完成したテキストのブロブを送信する必要がありますが、これは大きくなる可能性があります)

短所:データの操作は面倒であり(カーソル)、T-SQLでの文字列の操作(私は想像します)はWebサーバー(.NET)よりも遅くなります

b)必要なデータを取得し、Webサーバーでコードを生成します。

プロ:より速く、より柔軟な文字列処理

短所: SQLボックスからすべてのデータを戻す

この質問のために、約100,000行のデータの使用を検討しましょう。


更新: フォームの送信からスクリプトを生成し、結果をブラウザーに直接送信することを目的としていることについては言及しませんでした。したがって、SSISなどを使用するソリューションは、このシナリオでは使用が制限される可能性があります

4

3 に答える 3

1

SSIS (SQL Server Integration Services) の使用を検討してください。SSIS では変換が可能であり、大規模なセットのバッチ処理などを処理できる必要があります。

もちろん、操作の即時応答が必要な場合、SSIS はそれほど役に立ちません。変換がそれほど複雑ではなく、単一のクエリで実行できる場合は、ここで既に提案されているように、CLR を使用するオプションがあります。SQL# (SQLsharp) と呼ばれる SQL CLR 関数とプロシージャのライブラリを作成しました。これはhttp://www.SQLsharp.com/にあります。ほとんど無料です。DB_BulkCopy ストアド プロシージャを使用してこれを行うことができます (変換の複雑さによって異なります)。DB_BulkCopy プロシージャは Free バージョンで利用でき、.Net SqlBulkCopy クラスに基づいています (独自の SQL CLR メソッドを記述したい場合)。ただし、これにより、結果セットを宛先接続 (SQL Server または Oracle) に送信するために使用されるクエリを定義できます。このプロシージャはバッチ操作を処理するため、100,000 行の転送は単一のトランザクションにはなりません。

于 2012-05-02T14:27:18.167 に答える
1

純粋な経験レベルから、SQL Server はコードよりもはるかに遅い文字列操作を実行します。

あるソースからデータを取得して操作し、別のソースに配置するいくつかのプログラムをリファクタリングしました。まず、DataSet と System.Text.StringBuilder を使用してすべての文字列操作をコードに移動することで、最高のパフォーマンスが得られます。

最終的にこれを裏付けるドキュメントを見つけました: http://msdn.microsoft.com/en-us/library/ms131075.aspx

さらに、マネージド コードは、手続き型コード、計算、および文字列操作の点で、Transact-SQL よりもパフォーマンスが決定的に優れています。計算負荷が高く、データ アクセスを実行しない CLR 関数は、マネージ コードで記述することをお勧めします。

とはいえ、両方を試してベンチマークし、選択肢を比較検討しても害はないかもしれません。パフォーマンスに加えて、読みやすさ、将来のメンテナンスの容易さなどの要因を考慮してください。ベンチマーク時にパフォーマンスの違いがそれほど大きくない場合は、他の要因がより重要になる可能性があります。

他の回答に関する他のメモを読むと、パフォーマンスではなくセキュリティが決定要因になる可能性があります。 一般に、コードで文字列を操作し、信頼できない可能性のあるユーザー入力をサニタイズして、SQL インジェクションや XSS などを防ぐ方がはるかに簡単です。文字列のエスケープは純粋な T-SQL で可能ですが、コードでは、入力に基づいてパラメーター化されたクエリを作成できます。 、これは (OWASP によると)文字列をエスケープするよりも好ましい方法です。これは、T-SQL ではほぼ不可能です。

OWASP から:

この 3 番目の手法は、ユーザー入力をクエリに入れる前にエスケープすることです。動的クエリをプリペアド ステートメントまたはストアド プロシージャとして書き直すと、アプリケーションが破損したり、パフォーマンスに悪影響を及ぼしたりする可能性があることが懸念される場合は、これが最適な方法である可能性があります。ただし、この方法は、パラメーター化されたクエリを使用する場合に比べて脆弱です。この手法は、費用対効果の高い方法でレガシー コードを改造する場合にのみ、注意して使用する必要があります。ゼロから構築されたアプリケーション、または低リスク許容度を必要とするアプリケーションは、パラメータ化されたクエリを使用して構築または再作成する必要があります。

于 2012-05-02T14:28:15.763 に答える
1

私は文字 A を好みますが、カーソルの使用と SQL Server でのデータ操作について忘れることをお勧めします。既存のデータベースからデータを取得し、C# コードを使用して XML に変換します。データ構造を変換する場合は、堅牢なデータ変換で広く知られている XSLT を使用して XML を変換できます。

このリンクがお役に立てば幸いです。

于 2012-05-02T14:31:41.170 に答える