Каковы плюсы и минусы OleDB по сравнению с SQLClient? - PullRequest
14 голосов
/ 23 января 2009

Некоторый контекст: одна из систем, над которой я работаю, - это веб-приложение .net 2.0. VB.net для внешнего интерфейса и SQL Server 2005 для внутреннего интерфейса. По разным причинам, которые были утеряны во времени, оригинальный дизайнер решил использовать соединение .Net OleDB, а не соединение SQLClient.

После нескольких лет разработки эта конкретная система находится на пороге пересечения линии от "бета" до статуса "1.0". Одна из вещей, о которых мы говорили в этот момент, - это переход к соединению SQLClient. Хотя я знаю, что лучше всего использовать его и что это единственный способ получить доступ к более изящным возможностям SQL Server 2005 (которые мы, очевидно, не используем), каковы преимущества использования одного из Другой? Есть какие-то скрытые ошибки, о которых я должен знать? И кто-нибудь может указать мне на некоторые показатели, показывающие относительные скорости? (Я слышал, что SQLClient должен быть быстрее, но я никогда не видел цифр, подтверждающих это.)

Спасибо, все.

Ответы [ 5 ]

19 голосов
/ 23 января 2009

OleDb является более общим. Если в будущем вы когда-нибудь перейдете на другой тип базы данных, есть большая вероятность, что у него будет драйвер Ole, и вам не придется менять столько кода.

С другой стороны, собственный драйвер Sql Server должен быть быстрее, как вы сказали, и он имеет более приятную поддержку параметров (параметры могут использовать имена и не иметь в порядке ).

В своем личном опыте я никогда не замечал разницу в скорости; Я также не мог найти ничего, чтобы поддержать требование. Я подозреваю, что преимущество в производительности реально, но вам придется обработать миллионы записей, прежде чем начинать его измерять.

То, что я заметил, имело большое значение, были сообщения об ошибках. У меня были проблемы со старым приложением OleDb, и я отчаянно переключил его на SqlClient. Конечно, это все еще не работало, но лучшие сообщения об ошибках предоставили достаточно новой информации, и я смог решить проблему.

12 голосов
/ 01 июля 2010

OLEDB намного быстрее, чем SQLClient, ЗА ИСКЛЮЧЕНИЕМ, когда доступ осуществляется через ADO.NET. Драйверы для OLEDB написаны в собственном неуправляемом коде, однако, когда вы получаете доступ к этим драйверам через ADO.NET, вам необходимо пройти несколько уровней (включая уровень абстракции и уровень взаимодействия COM). Уровень абстракции обеспечивает управление ресурсами, например управление дескрипторами памяти, чтобы обеспечить правильную сборку мусора, изменение типов данных и параметров на типы .NET и преобразование буфера oledb в привязки строк и столбцов. Уровень взаимодействия COM обеспечивает передачу сообщений из .NET в COM и наоборот, включая блокировку / разблокировку / преобразование указателей.

Не слушайте никого, кто выдвигает ложные обвинения в отношении производительности OleDB, не понимая, как они тестировали его и какую среду использовали (управляемый код или управляемый код). Единственное, что замедляет работу OleDB, - это объем работы, необходимый для правильной работы нативного кода с управляемым кодом. Также имейте в виду, что библиотека SqlClient .NET имеет собственную систему слежения и НЕ является РОДНОЙ библиотекой .NET, как думает большинство людей. Библиотеки SqlClient в .NET используют классы SNINativeMethodWrapper и SNIPacket, которые являются оболочками, которые размещают данные между неуправляемым кодом (sqlncli.dll) и управляемым кодом .NET. Это недокументированная истина и причина, по которой .NET SqlClient никогда не сможет выполнить OleDB при использовании OleDB в собственном неуправляемом коде.

В итоге, если вы используете 100% управляемый код, вы получите лучшую производительность от System.data.SqlClient. Если у вас смешанная среда, вы получите гораздо более высокую производительность, общаясь с OleDB напрямую или с sqlncli.dll (SQL2005) или sqlncli10.dll (SQL 2008). Имейте в виду, что Microsoft обновляет и OleDB, и ODBC, и последние драйверы OleDB действительно взаимодействуют с новейшими неуправляемыми собственными клиентскими библиотеками SQL. Microsoft рекомендует использовать OleDB в неуправляемых приложениях, когда требуется высокая производительность.

Дополнительные сведения см. В разделе «Электронная документация по SQL Server 2008 \ Database Engine \ Development \ Руководство разработчика \ Программирование собственного клиента SQL Server 2008 \ Собственный клиент SQL Server 2008 (OLE DB)".

3 голосов
/ 12 февраля 2011

Вот немного PowerShell Код для прямого сравнения:

Ole-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

SQLClient:

$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

И в результате для специальных запросов этого типа я предпочитаю Ole-DB, поскольку мне нужно только настроить строку подключения для извлечения данных из базы данных Oracle.

3 голосов
/ 23 января 2009

Я с Джоэлом на этот раз, SqlClient лучше всего использовать, если вы планируете придерживаться SQL Server. Есть повышение производительности, но вы должны начать работать с большими наборами и большим количеством транзакций, чтобы обычно начать видеть преимущества этого.

В целом, предоставляемые ошибки и функциональность гораздо более приспособлены к возможностям SQL Server, поэтому, если хотите, «лучше». Он также поддерживает MARS, что для некоторых делает его обязательным переключателем.

2 голосов
/ 23 января 2009

Вы всегда можете написать пример приложения с некоторыми типичными операциями, используя SqlClient и OleDB, и сравнить их для сравнения производительности. Я сомневаюсь, что разница будет существенной, но есть только один способ выяснить это.

Я не думаю, что у вас есть какие-либо проблемы с использованием OleDb, если вы не используете экзотические типы данных, такие как XML, в этом случае вам, возможно, придется работать немного тяжелее.

...