参数缓存如何提高 ADO.NET 中的性能?

Posted

技术标签:

【中文标题】参数缓存如何提高 ADO.NET 中的性能?【英文标题】:How does parameter caching improve performance in ADO.NET? 【发布时间】:2011-09-24 14:29:33 【问题描述】:

希望加深我对 ADO.NET 的了解 - 在阅读企业库代码时,我注意到他们采用了一种称为“参数缓存”的技术

有人可以向我解释这如何提高性能以及这有助于哪些场景?

性能提升是纯粹来自构建 DbParameter 对象的成本,还是在查询计划方面 SQL Server 端发生了其他事情?

我认为,当您第一次组装 DbCommand 对象并与相应的 DbParameter 对象连接时,SQL Server 会在此时缓存一个执行计划以及对具有相同参数模板的相同过程的后续调用会重新使用服务器上现有的缓存执行计划吗?

【问题讨论】:

【参考方案1】:

我认为这纯粹是为了避免调用SqlCommandBuilder.DeriveParameters时产生的数据库往返:

如果参数信息已知 提前,效率更高 填充参数集合 明确设置信息。

【讨论】:

很抱歉,DeriveParameters 什么时候调用? 类的数据库系列具有允许您为存储过程“发现参数”的方法。这可以用来简单地避免输入它们,或者在数据访问层中,您可能会执行一些操作,例如将类的数据成员动态映射到 CRUD 存储过程的参数上。 参数缓存对日常 ADO.NET 的使用有什么好处吗?例如设置一个 DbCommand.CommandType = StoredProcedure,指定存储的过程名称,然后添加到它的参数集合?如果您事先已经知道存储过程的参数,何时会调用 DiscoverParameters? 如果您在设计时就知道参数并明确设置它们,那么缓存是没有好处的。参数缓存适用于在设计时参数未知的情况 - 例如必须针对任何存储过程运行的通用库代码。

以上是关于参数缓存如何提高 ADO.NET 中的性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 ssis 中的 ado.net 源?

如何在 ADO.NET 源 SSIS 中传递参数

asp.net中的ADO.NET实体框架适用于不同的数据库及其性能

如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?

ADO .NET 中常用的对象有那些?分别描述下?

如何在 ASP.NET Core MVC 中使用 ADO.NET 向存储过程添加参数?