全国服务热线:400-123-4657
公告:
诚信为本,市场在变,诚信永远不变...
联系我们contact us
400-123-4657全国服务热线:
地址:
广东省广州市天河区88号
邮箱:
admin@youweb.com
手机:
13800000000
电话:
400-123-4657
行业资讯 当前位置: 首页 > 摩鑫动态 > 行业资讯
SQL Server的查询优化器详解添加时间:2024-08-12
{ HASH | ORDER } GROUP

指定在查询的 GROUP BY 或 DISTINCT 子句中所说明的聚合应使用哈希或排列。

{ MERGE | HASH | CONCAT } UNION

指定所有 UNION 运算由合并、哈希或串联 UNION 集执行。?如果指定了多个 UNION 提示,查询优化器就会从这些指定的提示中选择开销最少的策略。

{ LOOP | MERGE | HASH } JOIN

指定整个查询中的所有联接操作由 LOOP JOIN、MERGE JOIN 或 HASH JOIN 执行。如果指定了多个联接提示,则优化器从允许的联接策略中选择开销最少的联接策略。

如果在同一查询中的 FROM 子句中还为一对特定的表指定了联接提示,则尽管仍须遵守查询提示,但该联接提示将优先联接这两个表。因此,这对表的联接提示可能只限制选择查询提示中允许的联接方法。有关详细信息,请参阅联接提示 (Transact-SQL)

EXPAND VIEWS

指定展开索引视图,而且查询优化器不将任何索引视图看作是查询中任何部分的替代。当视图名称由查询文本中的视图定义替换时,视图将展开。

实际上,该查询提示不允许在查询计划中直接使用索引视图和直接在索引视图上使用索引。

只有在查询的 SELECT 部分中直接引用视图,而且指定了 WITH (NOEXPAND) 或 WITH (NOEXPAND, INDEX(index_value?[,...n?] ) ) 时,才不展开索引视图。有关查询提示 WITH (NOEXPAND) 的详细信息,请参阅FROM

只有语句的 SELECT 部分中的视图(包括 INSERT、UPDATE、MERGE 和 DELETE 语句中的视图)才受提示影响。

FAST? number_rows

指定对查询进行优化,以便快速检索第一个?number_rows.。该值是非负整数。在返回第一个number_rows?后,查询继续执行并生成完整的结果集。

FORCE ORDER

指定在查询优化过程中保持由查询语法指示的联接顺序。?使用 FORCE ORDER 不会影响查询优化器可能的角色逆转行为。

注意注意

在 MERGE 语句中,如果未指定 WHEN SOURCE NOT MATCHED 子句,则按照默认的联接次序,先访问源表再访问目标表。如果指定 FORCE ORDER,则保留此默认行为。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。?当通过运行 UPDATE、DELETE、MERGE 或 INSERT 语句对表进行的索引列更改数目达到估计数目时,会自动重新编译查询,该估计数目即为估计的重新编译阈值。指定 KEEP PLAN 可确保当表有多个更新时不会频繁地对查询进行重新编译。

KEEPFIXED PLAN

强制查询优化器不因统计信息的更改而重新编译查询。?指定 KEEPFIXED PLAN 可确保仅当更改基础表的架构或在那些表上执行?sp_recompile?时才重新编译查询。

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

可防止查询使用非聚集的 xVelocity 内存优化的列存储索引。?如果查询包含避免使用 columnstore 索引的查询提示以及有关使用 columnstore 索引的索引提示,则这些提示将发生冲突,查询将返回错误。

MAXDOP? number

对于指定了?max degree of parallelism?配置选项的查询,会覆盖sp_configure?和资源调控器的该选项。MAXDOP 查询提示可以超出使用 sp_configure 配置的值。如果 MAXDOP 超出使用资源调控器配置的值,则数据库引擎会使用资源调控器 MAXDOP 值(如ALTER WORKLOAD GROUP (Transact-SQL)?中所述)。当使用 MAXDOP 查询提示时,所有和max degree of parallelism配置选项一起使用的语义规则均适用。有关详细信息,请参阅配置 max degree of parallelism 服务器配置选项

注意事项注意

如果 MAXDOP 设置为零,服务器将选择最大并行度。

MAXRECURSION? number

指定该查询允许的最大递归数。?number?是介于 0 至 32767 之间的非负整数。?如果指定 0,则没有限制。?如果未指定此选项,则对服务器的默认限制为 100。

当在查询执行期间达到指定或默认的 MAXRECURSION 数量限制时,将结束查询并返回错误。

由于此错误,该语句的所有结果都被回滚。?如果该语句为 SELECT 语句,则可能会返回部分结果或不返回结果。?所返回的任何部分结果都可能无法包括超过指定最大递归级别的递归级别上的所有行。

有关详细信息,请参阅?WITH common_table_expression (Transact-SQL)

OPTIMIZE FOR (? @variable_name?{ UNKNOWN | = literal_constant }?[ ,?... n] )

在编译和优化查询时指示查询优化器对局部变量使用特定值。?仅在查询优化期间使用该值,在查询执行期间不使用该值。

@variable_name

在查询中使用的局部变量的名称,可以为其分配用于 OPTIMIZE FOR 查询提示的值。

UNKNOWN

指定查询优化器在查询优化期间使用统计数据而不是初始值来确定局部变量的值。

literal_constant

要分配给?@variable_name?并用于 OPTIMIZE FOR 查询提示的文字常量值。literal_constant?只在查询优化期间使用,在查询执行期间不用作@variable_name的值。literal_constant?可以是任意可用文字常量表示的 SQL Server 系统数据类型。literal_constant?的数据类型必须可隐式转换为查询中@variable_name所引用的数据类型。

OPTIMIZE FOR 可以抵消优化器的默认参数检测行为,也可在创建计划指南时使用。有关详细信息,请参阅重新编译存储过程

OPTIMIZE FOR UNKNOWN

指示查询优化器在编译和优化查询时使用所有局部变量的统计数据而不是初始值,包括使用强制参数化创建的参数。

如果在同一查询提示中使用 OPTIMIZE FOR @variable_name =?literal_constant?和 OPTIMIZE FOR UNKNOWN,则查询优化器对特定值使用指定的?literal_constant,而对其余变量值使用 UNKNOWN。?这些值仅用于查询优化期间,而不会用于查询执行期间。

PARAMETERIZATION { SIMPLE | FORCED }

指定在编译查询时 SQL Server 查询优化器应用于此查询的参数化规则。

重要说明重要提示

PARAMETERIZATION 查询提示只能在计划指南中指定。?不能直接在查询中指定该查询提示。

SIMPLE 用于指示查询优化器尝试进行简单参数化。?FORCED 用于指示优化器尝试进行强制参数化。?PARAMETERIZATION 查询提示用于覆盖计划指南中 PARAMETERIZATION 数据库 SET 选项的当前设置。有关详细信息,请参阅使用计划指南指定查询参数化行为

RECOMPILE

指示 SQL Server 数据库引擎在执行为查询生成的计划后将其丢弃,从而在下次执行同一查询时强制查询优化器重新编译查询计划。如果未指定 RECOMPILE,数据库引擎将缓存查询计划并重新使用它们。在编译查询计划时,RECOMPILE 查询提示将使用查询中任意本地变量的当前值,如果查询位于存储过程中,这些当前值将传递给任意参数。

在只须重新编译存储过程中的一部分查询,而不是重新编译整个存储过程时,RECOMPILE 是创建使用 WITH RECOMPILE 子句的存储过程的很有用的替代方法。有关详细信息,请参阅重新编译存储过程在创建计划指南时,RECOMPILE 也很有用。

ROBUST PLAN

强制查询优化器尝试一个计划,该计划可能以性能为代价获得最大可能的行大小。?处理查询时,中间表和运算符可能需要存储和处理比输入行宽的行。?在有些情况下,行可能很宽,以致某个运算符无法处理行。如果发生这种情况,数据库引擎将在查询执行过程中生成错误。通过使用 ROBUST PLAN,可以指示查询优化器不考虑可能会遇到该问题的所有查询计划。

如果不能使用这样的计划,查询优化器将返回错误而不是延迟对查询执行的错误检测。行可以包含可变长度列;数据库引擎允许将行大小定义为超过数据库引擎处理能力的最大可能的大小。通常,应用程序存储实际大小在数据库引擎处理能力范围内的行,而不管最大可能大小。如果数据库引擎遇到过长的行,则返回执行错误。

USE PLAN N ' xml_plan '

强制查询优化器对查询使用由?'xml_plan'?指定的现有查询计划。不能使用 INSERT、UPDATE、MERGE 或 DELETE 语句来指定 USE PLAN。

TABLE HINT? ( exposed_object_name?[ ,?<table_hint> [ [ ,?]... n] ] )

将指定的表提示应用到与?exposed_object_name?对应的表或视图。我们建议仅在计划指南的上下文中将表提示用作查询提示。

exposed_object_name?可以为以下引用之一:

  • 当对查询的?FROM?子句中的表或视图使用别名时,exposed_object_name?就是别名。

  • 如果不使用别名,exposed_object_name?与 FROM 子句中引用的表或视图完全匹配。例如,如果使用由两部分组成的名称引用了表或视图,则exposed_object_name?就是这个由两部分组成的名称。

如果指定了?exposed_object_name?但未指定表提示,则将忽略在查询中指定为对象表提示的一部分的任何索引,并由查询优化器来决定索引的使用。当您无法修改原始查询时,可以使用此方法来消除 INDEX 表提示的影响。请参阅示例 J。

<table_hint> ::=?{ [ NOEXPAND ] { INDEX ( ?index_value?[ ,... n] ) | INDEX = ( index_value?) | FORCESEEK [ ( index_value ( index_column_name?[ ,...] ))?]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE |SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK }

要作为查询提示应用于与?exposed_object_name对应的表或视图的表提示。有关这些提示的说明,请参阅表提示 (Transact-SQL)

不允许将非 INDEX、FORCESCAN 和 FORCESEEK 的表提示用作查询提示,除非该查询已经具有一个指定该表提示的 WITH 子句。有关详细信息,请参阅备注。

注意事项注意

指定带参数的 FORCESEEK 限制优化器可以考虑的计划数大于指定不带参数的 FORCESEEK 时的计划数。这可能导致在更多情况下出现“无法生成计划”错误。在未来的版本中,对优化器进行内部修改后可允许考虑更多计划。

平台注册入口