准备命令
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
适用于 SQL Server 的 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 的 OLE DB 驱动程序会执行临时存储过程,并返回结果,就像执行语句本身一样。
临时存储过程的创建由特定于适用于 SQL Server 的 OLE DB 驱动程序的初始化属性 SSPROP_INIT_USEPROCFORPREP 控制。 如果属性值为 SSPROPVAL_USEPROCFORPREP_ON 或 SSPROPVAL_USEPROCFORPREP_ON_DROP,则适用于 SQL Server 的 OLE DB 驱动程序会在准备命令时尝试创建存储过程。 如果应用程序用户拥有足够的 SQL Server 权限,存储过程将创建成功。
对于很少断开连接的使用者,临时存储过程的创建可能需要大量的 tempdb(即在其中创建临时对象的 SQL Server 系统数据库)资源。 如果 SSPROP_INIT_USEPROCFORPREP 的值为 SSPROPVAL_USEPROCFORPREP_ ON,那么由适用于 SQL Server 的 OLE DB 驱动程序创建的临时存储过程在仅当创建命令的会话断开与 SQL Server 实例的连接时才会被删除。 如果该连接为数据源初始化时创建的默认连接,则临时存储过程仅当数据源变成未初始化状态时才删除。
如果 SSPROP_INIT_USEPROCFORPREP 的值为 SSPROPVAL_USEPROCFORPREP_ON_DROP,那么当发生以下情况之一时,会删除适用于 SQL Server 的 OLE DB 驱动程序临时存储过程:
使用者使用 ICommandText::SetCommandText 指示新的命令 。
使用者使用 ICommandPrepare::Unprepare 指示它不再需要命令文本 。
使用者使用临时存储过程释放对命令对象的所有引用。
命令对象在 tempdb 中最多具有一个临时存储过程 。 任何现有的临时存储过程都表示特定命令对象的当前命令文本。