OLEDB 比 SQLClient 快得多,但通过 ADO.NET 访问时除外。OLEDB 的驱动程序是用本机非托管代码编写的,但是,当您通过 ADO.NET 访问这些驱动程序时,您必须经过几个层(包括抽象层和 COM 互操作层)。抽象层负责资源管理,例如管理内存句柄以确保正确进行垃圾收集、将数据类型和参数更改为 .NET 类型以及将 oledb 缓冲区转换为行和列绑定。COM 互操作层负责编组从 .NET 到 COM 的传递消息,反之亦然,包括锁定/解锁/转换指针。
不要听任何人在不了解他们如何测试它以及他们使用什么环境(托管代码与托管代码)的情况下对 OleDB 的性能进行虚假指控。唯一让 OleDB 变慢的是需要大量的管道才能使本机代码与托管代码配合得很好。还要记住,SqlClient .NET 库有它自己的管道,它不像大多数人认为的那样是一个 NATIVE .NET 库。.NET 中的 SqlClient 库使用 SNINativeMethodWrapper 和 SNIPacket 类,它们是在非托管代码 (sqlncli.dll) 和托管 .NET 代码之间编组数据的包装器。这是未记录的事实,也是当您在本机非托管代码中使用 OleDB 时 .NET SqlClient 永远无法胜过 OleDB 的原因。
总之,如果您使用 100% 托管代码,您将从 System.data.SqlClient 获得更好的性能。如果您有一个混合环境,您将获得更好的性能直接与 OleDB 或 sqlncli.dll (SQL2005) 或 sqlncli10.dll (SQL 2008) 对话。请记住,Microsoft 正在更新 OleDB 和 ODBC,并且最新的 OleDB 驱动程序确实与最新的非托管本机 SQL 客户端库通信。Microsoft 建议在需要高性能时在非托管应用程序中使用 OleDB。
有关详细信息,请参阅“SQL Server 2008 联机丛书\数据库引擎\开发\开发人员指南\SQL Server 2008 Native Client Programming\SQL Server 2008 Native Client (OLE DB)”。