直接执行

直接执行是最基本的语句执行方式。应用程序生成包含 Transact-SQL 语句的字符串,然后使用 SQLExecDirect 函数将该字符串提交执行。当该语句到达服务器时,SQL Server 将其编译为执行计划,然后立即运行该执行计划。

直接执行是在运行时生成和执行语句的应用程序的常用执行方式,它也是只需执行一次的语句的最有效方法。对于许多数据库而言,它的缺点就是每次执行 SQL 语句都必须对该语句进行分析和编译,如果该语句多次执行,就会增加开销。

连接到 SQL Server 7.0 之前的版本时,应该在以下情况下使用直接执行:

  • 语句的执行次数很可能少于四次。

  • 调用存储过程。

SQL Server 2000 和更高版本显著提高了在多用户环境中直接执行通常执行的语句的性能;如果将 SQLExecDirect 与参数标记配合用于通常执行的 SQL 语句,其效率可接近准备好的执行。

连接到 SQL Server 的某个实例时,SQL Server Native Client ODBC 驱动程序使用 sp_executesql 传输 SQLExecDirect 上指定的 SQL 语句或批处理。SQL Server 中的逻辑可以快速确定使用 sp_executesql 执行的 SQL 语句或批处理是否与生成执行计划(已存在于内存中)的语句或批处理相匹配。如果匹配,SQL Server 只需重用现有计划,而无需编译新计划。这意味着在有多个用户的系统中,使用 SQLExecDirect 执行的通常执行的 SQL 语句将享有重用计划所具备的许多优点,而在 SQL Server 的早期版本中只有存储过程才享有这些优点。

仅当多个用户执行同一 SQL 语句或批处理时,才会从重用执行计划中受益。请遵照以下编码约定,提高不同客户端执行的 SQL 语句的相似性,以便能够重用执行计划:

  • 不要在 SQL 语句中包括数据常量;改用绑定到程序变量的参数标记。有关详细信息,请参阅使用语句参数

  • 使用完全限定对象名。如果未限定对象名,则不重用执行计划。

  • 令应用程序连接尽量使用常用的一组连接和语句选项。从具有某一组选项(如 ANSI_NULLS)的连接生成的执行计划不会重复用于具有另一组选项的连接。SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 访问接口的这些选项都具有相同的默认设置。

如果使用上述约定对使用 SQLExecDirect 执行的所有语句进行编码,SQL Server 将尽可能地重用执行计划。