[查询优化]_Hint

来源:互联网 发布:开源商城 java app 编辑:程序博客网 时间:2024/06/15 22:17

Hint

使用前的提示
Hint请谨慎使用,通常情况下优化器可以很好的完成查询任务。
1、 不适当的使用Hint,可能会带来更糟糕的执行计划。
2、 不是所有的性能问题,都由不当的计划造成。
3、 执行计划得问题,可以由更新统计值或改变模式来解决。
4、 Hint只能让优化器找到那些即使没有Hint查询优化器也能找到的计划。
5、 应用程序中,请尽量少的使用Hint。
6、 对于Insert、Update、Delete的使用,请测试select的结果。用于查证问题。
7、 尝试移出查询中的连接、子查询或聚合,以查看性能问题。
8、 使用Statistics profile和Statistics XML 用以输出开销最大的运算符,用于验证优化器成本评估是否有效。

Hint的类型
被忽略的——影响计划选择的Hint
被忽略的——规划缓存和重编译的Hint
被忽略的——影响锁的Hint

影响计划选择的Hint
A:目标导向Hint
传递逻辑的目标给优化器,而不会具体制定优化器应该如何达到此目标,应该使用什么物理运算符,以及如何排列这些运算符。
(例如:FAST N / OPTIMIZE FOR)

B:物理运算符Hint
告知优化器,在查询计划中使用指定的运算符或运算符集,或者按一种特别的方式组织运算符而不给出任何关于视图实现的行为或为什么要这个强制的特定计划的提示。
(例如:连接Hint / FORCE ORDER /USE PLAN)

WHY ? A 优于B

1、 没有对查询计划了解透彻的时候, A具有更好的性能。
2、 所有的Hint都会带来风险。A仅仅指出方向,具体实现的方法依靠优化器实现。不必担心优化器不会产生计划。

查询Hint================================================

不可在子查询中指定,也不能应用于CTE、视图或者TVF定义。

FAST N [目标向导Hint]
告知优化器尽可能快的产生前N个输出行的计划

特点:
1、 对于快速显示整个屏幕的数据很有效。
2、 会阻止优化器选择带有阻塞运算符的计划。
3、 FAST N 仅仅是有一个Top N子句,但会产生一个最终会输出原始查询所有行的计划。
      而Top N子句实际上是把查询产生的行限制为N。
4、 不会引起优化失败。
5、 N的值不同,产生计划有可能完全不同。

OPTIMIZE FOR [目标向导Hint]
请求优化器对于指定的参数值产生一个计划

特点:
1、 对非对称数据集尤其有用。
2、 不会引起优化失败。
3、 参数值需谨慎考虑。

LOOP/MERGE/HASH JOIN
强制连接类型

特点:
1、 必须可以使用强制的连接类型来执行查询中的全部连接。否则将无法生成有效的计划,并且导致错误。
2、 对于有多个连接的查询,此Hint并不适用。

ORDER / HASH GROUP
强制聚合类型

特点:
1、ORDER GROUP 强制使用流聚合,即按照键分组排序。HASH GROUP 强制使用哈西聚合。
2、没有任何方法可以强制优化器为一个标量聚合使用哈希聚合。使用HASH GROUP 将会产生错误。

CONCAT / MERGE / HASH UNION
强制联合类型

特点:
1、 CONCAT UNION 强制优化器要么选择一个常规的(无序)串联运算符,要么选择一个保序合并串联运算符。
2、 此类运算符不能移出重复。使用CONCAT UNION 会去除重复。

FORCE ORDER
控制优化器选择的连接顺序和聚合位置

提示:
1、 以优化器选择的计划开始。
2、 尝试遵循自然的连接顺序,并尽可能利用外键关系。避免交叉连接和笛卡尔积
3、 尝试从连接较小的标或可以过滤掉尽可能多地表开始。
4、 尝试延迟连接较大的表或会增加结果集基数的表开始。
5、 一般情况,把一个能够加大的较少基数的聚合位置提前,另外,一个高可选性连接放到聚合前有可能会更好。
6、 有嵌套循环连接时,尝试在连接外侧使用小一些的表,并在内侧选择带有合适索引的表。
7、 有哈希连接时,尝试将较小的表或输入放在连接的建立侧。可以最小化哈希连接的内存使用。并避免内存不足,把行写回磁盘的风险。

MAXDOP N
改变使用在优化和执行查询两方面的并行度

提示:
1、与数据库级别的最大并行度选项同时使用时,优先于数据库级别的选项。

EXPAND VIEWS
可以阻止优化器匹配索引视图; 仅企业版可用

表Hint===============================================

可在子查询,试图,内联TVF中使用


INDEX
强制查询优化器未一个扫描或查找使用一个指定的索引。

提示:
1、 不能强制优化器选择一个索引寻找来代替一个索引扫描。
2、 不能强制优化器产生一个索引联合计划。

NOEXPAND
索引视图匹配,也是写一条为其他版本SQL Server实用索引视图的为唯一途径

FASTFIRSTROW
等价于FAST 1查询Hint;FAST N优先于FASTFIRSTROW。

ANSI-Style
允许对于连接顺序和连接类型(物理连接运算符)两者的细粒度控制

USE PLAN
提供XML计划来准确的告诉优化器所希望的计划。

提示:
1、 XML计划必须是模式有效的。
2、 不能强制优化器产生一个无效的计划
3、 模式改变将会造成无效
4、 XML计划的书写比较困难
5、 SQL Server不能缓存长度超过8KB的查询计划
6、 升级后不能保证语句正常工作
7、 不能强制用于Insert、update 和delete计划
8、 少数运算符不能强制使用(Assert/Bitmap/Compute Scalar)