直接执行
直接执行是最基本的语句执行方式。 应用程序生成包含 Transact-SQL 语句的字符串,并使用 SQLExecDirect 函数提交该字符串以供执行。 当 语句到达服务器时,SQL Server将其编译为执行计划,然后立即运行执行计划。
直接执行是在运行时生成和执行语句的应用程序的常用执行方式,它也是只需执行一次的语句的最有效方法。 对于许多数据库而言,它的缺点就是每次执行 SQL 语句都必须对该语句进行分析和编译,如果该语句多次执行,就会增加开销。
SQL Server显著提高了在多用户环境中直接执行常见语句的性能,并且将 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 语句中包括数据常量;改用绑定到程序变量的参数标记。 有关详细信息,请参阅 Using Statement Parameters。
使用完全限定对象名。 如果未限定对象名,则不重用执行计划。
令应用程序连接尽量使用常用的一组连接和语句选项。 从具有某一组选项(如 ANSI_NULLS)的连接生成的执行计划不会重复用于具有另一组选项的连接。 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 访问接口对这些选项具有相同的默认设置。
如果使用 SQLExecDirect 执行的所有语句都使用这些约定进行编码,SQL Server可以在出现机会时重用执行计划。