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

C# 参数缓存如何提高ADO.NET中的性能?,c#,.net,ado.net,enterprise-library,data-access-layer,C#,.net,Ado.net,Enterprise Library,Data Access Layer,为了加深对ADO.NET的了解,在阅读企业库代码时,我注意到它们使用了一种称为“参数缓存”的技术 有人能向我解释一下这是如何提高性能的,以及这有什么帮助吗 性能的提高纯粹是来自DbParameter对象的构造成本,还是SQL Server端在查询计划方面发生了其他事情 我认为,当您第一次组装DbCommand对象并将其与相应的DbParameter对象连接起来时,SQL Server此时会缓存一个执行计划,并且使用相同的参数模板对相同过程的后续调用会重新使用服务器上现有的缓存执行计划吗 我认为这

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

有人能向我解释一下这是如何提高性能的,以及这有什么帮助吗

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


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

我认为这纯粹是为了避免在呼叫时发生数据库往返:

如果参数信息已知 事先,这样做更有效 通过以下方式填充参数集合: 明确设置信息


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