Delphi与SQL Server:OLEDB与Native Client驱动程序

Jer*_*dge 6 sql-server delphi oledb ado sqlncli

我被告知SQL Native Client 应该比OLEDB驱动程序更快.所以我把一个实用工具放在一起进行两者之间的负载测试 - 结果好坏参半.有时一个更快,有时另一个更快,无论查询是什么(简单选择,where子句,join,order by等).当然,服务器承担了大部分工作量,但我对进入PC的数据到应用程序中可访问数据之间的时间感兴趣.

负载测试由非常小的查询组成,这些查询返回非常大的数据集.例如,我这样做select * from SysTables,这个表有50,000多条记录.在收到数据之后,我再次循环执行结果(使用while而不是Q.eof ... Q.next ...等).我也试过在查询中添加一些东西 - 比如order by Val哪里Val是一个varchar(100)字段.

这是我的负载测试仪的样本,最底部的数字是平均值...

在此输入图像描述

那么真的,两者之间有什么区别?我知道OLE非常灵活,支持许多不同的数据库引擎,而Native Client仅针对SQL Server.但是幕后还有什么呢?这又如何影响Delphi如何使用这些驱动程序?

这通过TADOConnection组件特别使用ADO TADOQuery.

我不一定在寻找或想办法提高性能 - 我只需要知道驱动程序之间的区别.

Arn*_*hez 7

正如微软所说:

SQL Server Native Client是一个独立的数据访问应用程序编程接口(API),用于OLE DB和ODBC,它是在SQL Server 2005中引入的.SQL Server Native Client将SQL OLE DB提供程序和SQL ODBC驱动程序组合到一起一个本机动态链接库(DLL).

根据我的理解,ADO只是OleDB上面向对象的应用程序级数据库层.它将在所有情况下使用OleDB.提供商使用了哪些变化.如果指定SQLNCLI10提供程序,则将使用最新版本的协议.如果指定SQLOLEDB提供程序,则将使用通用SQL Server 2000 +协议.

因此:

  ADO -> OleDB -> SQLNCLI10 provider -> MS SQL Server (MSSQL 2000, 2005 or 2008 protocol)
  ADO -> OleDB -> SQLOLEDB provider -> MS SQL Server (MSSQL 2000 protocol)
Run Code Online (Sandbox Code Playgroud)

关于性能,我认为你不会有太大的不同.与往常一样,它将取决于处理的数据.

但是恕我直言,建议您为您的数据库使用最合适的提供商.某些数据(如var(maxchar)Int64)被告知最好处理.并且SQLNCLI10提供商已经更新,所以我想它会更加优化.


Ole*_*Dok 5

我认为你应该集中精力优化:

  • sql server引擎和数据库设置
  • 你的疑问
  • 您的数据架构

连接库之间的速度差异非常小,甚至可以忽略不计,它可能导致系统非常小的减速,并且在非常特定的情况下

  • 我[测量了实际数据](http://blog.synopse.info/post/2011/07/09/SynDBOracle%3A-Open-Source-native-Oracle-access)直接连接Oracle OCI为3比使用Oracle的官方OleDB提供程序快5倍,比旧的BDE`TQuery`快10倍.这不是*可忽略不计.我说的是真实的数据.使用SQL Server可能不太明显,但我在某些基准测试中读到ODBC在某些情况下比OleDB更快(因为它更轻).使用今天的现代数据库,在检索大量行时,客户端可能是真正的瓶颈. (4认同)

da-*_*oft 5

  1. 在您的问题中,您正在使用OLE和SQL Native Client.可能你在同一时间意味着很少的东西:

    • OLE - > OLEDB,这是一种过时的通用数据访问技术;
    • OLE - >"SQL Server OLEDB Provider",它是SQL Server 2000 OLEDB提供者;
    • SQL Server Native Client,它是SQL Server 2005及更高版本的客户端软件.它包括作为OLEDB提供程序,作为ODBC驱动程序.
  2. 如果要谈论OLEDB提供程序和支持的SQL Server版本,那么:

    • "SQL Server OLEDB Provider"(SQLOLEDB)支持SQL Server 2000协议;
    • "SQL Server Native Client 9"(SQLNCLI)支持SQL Server 2000和2005协议;
    • "SQL Server Native Client 10"支持SQL Server 2000,2005和2008协议.

    您没有说出您正在使用的SQL Server版本.通常,最好是使用与您的SQL Server版本对应的SQL Server OLEDB提供程序.否则,您可能会遇到服务器和客户端版本之间的不兼容问题.

  3. 抽象地比较,我只能推测SQLNCLI和SQLOLEDB之间的差异:

    • 一个是更正确地使用服务器协议;
    • 一个是使用更高级的协议功能;
    • 一个人执行更多处理,处理更多情况;
    • 一个使用更通用/优化的数据表示.

    如果没有正确的基准应用程序和环境,很难接受您的比较结果,因为它们可能取决于多种因素.