直接执行
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
直接执行是最基本的语句执行方式。 应用程序生成包含 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 语句参数。
使用完全限定对象名。 如果未限定对象名,则不重用执行计划。
令应用程序连接尽量使用常用的一组连接和语句选项。 从具有某一组选项(如 ANSI_NULLS)的连接生成的执行计划不会重复用于具有另一组选项的连接。 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序都对这些选项具有相同的默认设置。
如果使用 SQLExecDirect 执行的所有语句都使用这些约定进行编码,则当出现机会时,SQL Server 可以重复使用执行计划。