18

いくつかのコンテキスト:私が取り組んでいるシステムの1つは、.net2.0Webアプリケーションです。フロントエンドにはVB.net、バックエンドにはSQLServer2005。時間の経過とともに失われたさまざまな理由により、元の設計者はSQLClient接続ではなく.NetOleDB接続を使用することを決定しました。

数年の開発の後、この特定のシステムは、「ベータ」から「1.0」のステータスへの境界線を越えようとしています。この時点で話していることの1つは、SQLClient接続への移行です。これを使用することがベストプラクティスであり、SQL Server 2005のより優れた機能(明らかに使用していません)を利用する唯一の方法であることは承知していますが、SQLServer2005を使用することの利点は何ですか。他の?私が知っておくべき隠された落とし穴はありますか?そして、誰かが相対速度を示すいくつかのベンチマークを私に指摘できますか?(SQLClientの方が高速であると聞いていますが、それを裏付ける数字は見たことがありません。)

皆さんありがとう。

4

5 に答える 5

23

OleDbはより一般的です。将来、別の種類のデータベースに移動する場合は、Oleドライバーが含まれている可能性が高く、それほど多くのコードを変更する必要はありません。

一方、SQL Serverネイティブドライバーは、あなたが言ったように高速であるはずであり、より優れたパラメーターサポートを備えています(パラメーターは名前を使用でき、順番に並べる必要はありません

私の個人的な経験では、速度の違いに気づいたことはありません。また、主張を裏付けるものも見つかりませんでした。パフォーマンスの利点は本当だと思いますが、測定を開始する前に何百万ものレコードを処理する必要があります。

私が気付いたのは、意味のある違いをもたらしたのはエラーメッセージでした。古いOleDbアプリで問題が発生し、必死になってSqlClientに切り替えました。もちろん、それでも機能しませんでしたが、より良いエラーメッセージにより、問題を修正するのに十分な新しい情報が提供されました。

于 2009-01-23T18:26:15.483 に答える
13

OLEDB は、ADO.NET 経由でアクセスする場合を除き、SQLClient よりもはるかに高速です。OLEDB のドライバーはネイティブのアンマネージ コードで記述されていますが、ADO.NET を介してこれらのドライバーにアクセスする場合、いくつかのレイヤー (抽象化レイヤーと COM 相互運用レイヤーを含む) を通過する必要があります。抽象化レイヤーは、メモリ ハンドルを管理してガベージ コレクションが正しく行われるようにする、データ型とパラメーターを .NET 型に変更する、oledb バッファーを行バインディングと列バインディングに変換するなどのリソース管理を行います。COM 相互運用レイヤーは、ポインターのロック/ロック解除/変換を含め、.NET から COM へ、およびその逆にメッセージを渡すマーシャリングを処理します。

OleDB のテスト方法と使用した環境 (マネージ コードとマネージ コード) を理解せずに、OleDB のパフォーマンスについて誤った非難をする人の話を聞かないでください。OleDB の速度を低下させる唯一の要因は、ネイティブ コードをマネージ コードとうまく連携させるために必要な配管の量です。また、SqlClient .NET ライブラリには独自の配管があり、ほとんどの人が考えるようなネイティブの .NET ライブラリではないことに注意してください。.NET の SqlClient ライブラリは、アンマネージド コード (sqlncli.dll) とマネージド .NET コードの間でデータをマーシャリングするラッパーである SNINativeMethodWrapper クラスと SNIPacket クラスを使用します。これは文書化されていない真実であり、ネイティブのアンマネージ コードで OleDB を使用する場合、.NET SqlClient が OleDB よりも優れたパフォーマンスを発揮できない理由です。

要約すると、100% マネージ コードを使用している場合は、System.data.SqlClient のパフォーマンスが向上します。混合環境の場合、OleDB と直接通信するか、sqlncli.dll (SQL2005) または sqlncli10.dll (SQL 2008) と通信すると、はるかに優れたパフォーマンスが得られます。OleDB と ODBC は両方とも Microsoft によって更新されており、最新の OleDB ドライバーは最新のアンマネージ ネイティブ SQL クライアント ライブラリと対話することに注意してください。Microsoft は、高いパフォーマンスが必要な場合、アンマネージド アプリケーションで OleDB を使用することをお勧めします。

詳細については、「SQL Server 2008 Books Online\Database Engine\Development\Developer's Guide\SQL Server 2008 Native Client Programming\SQL Server 2008 Native Client (OLE DB)」を参照してください。

于 2010-07-01T03:59:47.460 に答える
3

直接比較するためのPowerShellコードを次に示します。

オレ DB:

$ConnectionString      = "server=localhost;database=MyDatabase;trusted_connection=yes;Provider=SQLNCLI10;"
$sql = "SELECT * FROM BigTable"

$conn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$conn.open()
$cmd = New-Object system.Data.OleDb.OleDbCommand($sql,$conn)
#$cmd.CommandTimeout = $timeout
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd)
$dt = New-Object system.Data.datatable
[GC]::Collect()
$start = get-date
[void]$da.fill($dt)
$now = get-date
[int]($now - $start).Milliseconds
$conn.close()
#$dt

SQL クライアント:

$ConnectionString      = "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True"
$sql = "SELECT  * FROM BigTable"


$conn=new-object System.Data.SQLClient.SQLConnection($ConnectionString) 
$conn.Open() 
$cmd=new-object System.Data.SQLClient.SQLCommand($sql,$conn)
#   $cmd.CommandTimeout=$timeout
$dt = New-Object system.Data.datatable
$da=New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
[GC]::Collect()
$start = get-date
[void]$da.fill($dt)
$now = get-date
[int]($now - $start).Milliseconds
$conn.close()
#$dt

私は得た

Ole-DB : SQL-Client
538 - 839
767 - 456
592 - 678

その結果、このタイプのアドホック クエリでは、接続文字列を調整して Oracle データベースからデータを取得するだけでよいため、Ole-DB を好みます。

于 2011-02-12T19:15:41.667 に答える
2

SqlClient と OleDB を使用していくつかの典型的な操作を含むサンプル アプリケーションをいつでも作成し、それらをベンチマークしてパフォーマンスを比較することができます。違いが大きいとは思えませんが、調べる方法は 1 つしかありません。

XML のようなエキゾチックなデータ型を使用していない限り、OleDb の使用に問題はないと思います。

于 2009-01-23T18:37:18.050 に答える