SQL Server Native Client OLE DB 提供程序支持命令准备,以便优化单个命令的多个执行;但是,命令准备会产生开销,使用者不需要准备一个命令来多次执行该命令。 通常,如果命令的执行次数超过三次,则应准备好该命令。
出于性能原因,命令准备将推迟到命令执行。 这是默认行为。 在执行命令或执行元属性作之前,不知道正在准备的命令中的任何错误。 将 SQL Server 属性SSPROP_DEFERPREPARE设置为 FALSE 可以关闭此默认行为。
在 SQL Server 中,当直接执行命令(无需先准备命令)时,将创建并缓存执行计划。 如果再次执行 SQL 语句,SQL Server 有一种有效的算法,用于将新语句与缓存中的现有执行计划匹配,并重复使用该语句的执行计划。
对于准备好的命令,SQL Server 为准备和执行命令语句提供本机支持。 准备语句时,SQL Server 会创建一个执行计划,对其进行缓存,并将此执行计划的句柄返回到提供程序。 然后,提供程序使用此句柄重复执行语句。 不会创建任何存储过程。 由于句柄直接标识 SQL 语句的执行计划,而不是将语句与缓存中的执行计划匹配(就像直接执行一样),因此,如果知道语句将执行多次,则准备语句比直接执行语句更有效。
在 SQL Server 2005 中,准备的语句不能用于创建临时对象,也不能引用创建临时对象的系统存储过程,如临时表。 必须直接执行这些过程。
不应准备某些命令。 例如,不应准备指定存储过程执行的命令或包含 SQL Server 存储过程创建无效文本。
如果创建了临时存储过程,SQL Server Native Client OLE DB 提供程序将执行临时存储过程,并返回结果,就好像执行了语句本身一样。
临时存储过程创建由 SQL Server Native Client OLE DB 访问接口 -specific 初始化属性SSPROP_INIT_USEPROCFORPREP控制。 如果属性值为SSPROPVAL_USEPROCFORPREP_ON或SSPROPVAL_USEPROCFORPREP_ON_DROP,则 SQL Server Native Client OLE DB 访问接口在准备命令时尝试创建存储过程。 如果应用程序用户具有足够的 SQL Server 权限,则存储过程创建成功。
对于不经常断开连接的使用者,创建临时存储过程可能需要 大量 tempdb 资源,即在其中创建临时对象的 SQL Server 系统数据库。 当SSPROP_INIT_USEPROCFORPREP的值SSPROPVAL_USEPROCFORPREP_ ON 时,SQL Server Native Client OLE DB 访问接口创建的临时存储过程只会在创建该命令的会话失去与 SQL Server 实例的连接时删除。 如果该连接是在数据源初始化上创建的默认连接,则仅当数据源未初始化时,才会删除临时存储过程。
当SSPROP_INIT_USEPROCFORPREP的值SSPROPVAL_USEPROCFORPREP_ON_DROP时,当发生以下任一情况时,将删除 SQL Server Native Client OLE DB 访问接口临时存储过程:
使用者使用 ICommandText::SetCommandText 来指示新命令。
使用者使用 ICommandPrepare::Unprepare 来指示它不再需要命令文本。
使用者使用临时存储过程释放对命令对象的所有引用。
命令对象在 tempdb 中最多具有一个临时存储过程。 任何现有的临时存储过程都表示特定命令对象的当前命令文本。