在 SQL Server Native Client 中准备命令

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

SQL Server Native Client OLE DB 提供程序支持命令准备,以便优化单个命令的多个执行;但是,命令准备会产生开销,使用者不需要准备一个命令来多次执行该命令。 一般而言,如果命令的执行次数超过三次,则应当进行准备。

出于性能方面的考虑,命令准备会延迟至命令执行之时。 此选项为默认行为。 待准备命令中的任何错误,直到执行命令或执行元属性操作时才会发现。 将 SQL Server 属性 SSPROP_DEFERPREPARE 设置为 FALSE 可以关闭此默认行为。

在 SQL Server 中,直接执行命令(即不提前准备命令)时,会创建并缓存一个执行计划。 如果再次执行该 SQL 语句,则 SQL Server 会采用有效的算法将新的语句与缓存中的现有执行计划进行匹配,然后再次使用该语句的执行计划。

对于准备好的命令,SQL Server 为准备和执行命令语句提供了本机支持。 在准备语句时,SQL Server 创建一个执行计划,进行缓存,然后将该执行计划的句柄返回访问接口。 随后,访问接口使用该句柄来重复执行该语句。 不创建存储过程。 由于句柄直接标识 SQL 语句的执行计划,而不是将语句与缓存中的执行计划匹配(就像直接执行一样),因此,如果知道语句将执行多次,则准备语句比直接执行语句更有效。

在 SQL Server 2005 (9.x) 中,无法使用预定义语句创建临时对象,也无法引用创建临时对象(如临时表)的系统存储过程。 必须直接执行这些过程。

始终不应准备某些命令。 例如,不应对指定存储过程执行的命令进行准备,也不应准备包含对 SQL Server 存储过程创建无效的文本的命令。

如果创建了临时存储过程,SQL Server Native Client OLE DB 提供程序将执行临时存储过程,并返回结果,就好像执行了语句本身一样。

临时存储过程创建由 SQL Server Native Client OLE DB 提供程序特定的初始化属性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 中最多具有一个临时存储过程 。 任何现有的临时存储过程都表示特定命令对象的当前命令文本。

另请参阅

命令