• SQL Server查询优化中的两个选项


    本文中,我们将介绍两个SQL Server中的可用概念,它们是使用SQL Server时值得注意的技术。

    1.        OPTIMIZE FOR Unknown

    SQL Server 2005版本中增加了OPTIMIZE FOR提示(hint),允许DBA确定用于基数评估和优化的字面值。如果我们有一张数据分布倾斜的表,OPTIMIZE FOR能被用于优化为广泛范围参数值提供合理性能的通用值。当对所有参数值来说性能并非最好时,相比有时做查找(seek,对于选择性较好的参数值),有时做扫描(scan,对于选择性一般的参数值),所有场景具备同样的执行时间也许会更可取,这依赖于最初编译期间传入的参数值。

    不幸的是,OPTIMIZE FOR仅允许字面值。如果变量为类似日期时间(datetime)或顺序数(其本质随时间而增长),那么,确定的任何固定值不久将因变得过时而不得不修改该提示来确定一个新值。即使该参数值域随时间保持相对稳定,但提供字面值时你不得不实验和发现一个足够好的通用值,这有时是很难的或很费时间的。

    最后,为OPTIMIZER FOR提供数值将通过改变使用该参数的谓词基数评估而影响计划的选择。在OPTIMIZE FOR提示中,如果你提供了一个不存在或稀有值,那么,你就减少了基数评估值,这将会影响成本和最终计划的选择。

    如果你只想得到一个“平均”值而并不关心该值是什么,OPTIMIZE FOR (@variable_name UNKNOWN)提示将导致优化器忽略影响基数评估的这个参数值。取而代之是用柱状图,基数评估将由密度、关键信息或依赖谓词的固定选择性评估得出。这将导致一个并不需要DBA必须一直监视和改变参数值来维护一致性能的可预见评估。

    语法变化将告诉优化器忽视所有参数值,这只需确定OPTIMIZE FOR UNKNOWN并漏掉括号和变量名。确定OPTIMIZE FOR将导致ParameterCompiledValue从showplan XML输出中消失,正像参数嗅探(sniffing)没有发生一样。不管传递的参数,最终计划将是一样的,并且,也许会给出更加可预见的查询性能。

    2.        QUERYTRACEON 和QUERYRULEOFF

    有些场景中,开发人员也许建议用跟踪标志(trace flag)来避免查询计划或优化器问题。或者,他们也许发现禁用某个特定优化器规则会阻止特定问题的发生。一些跟踪标志很常见,以至于难以预见开启这些跟踪标志是否能很好的解决所有查询问题,或该问题是否只针对研究的特定查询。类似的,大多数优化器规则并非本身不好,整个系统范围内禁用该规则可能会导致其他方面的性能退化。

    SQL Server 2008中,可以在特定查询运行期间开启某个跟踪标志,或通过如下未被归档QUERYTRACEON或QUERYRULEOFF提示仅在查询编译期间禁用某个优化器规则。

    select @v_test=c1from t1 where c1=2 option(recompile,querytraceon 2389);

    select @v_test=c1from t1 where c1=2 option(recompile,queryruleoff OmitMyidx);

    上述第二个语句显示的语法也许会导致“no plan”错误。预先未与开发人员讨论以确保完全理解该规则及禁用可能带来的后果,就不应该使用QUERYRULEOFF。数据库属主通常拥有创建一个计划指导(plan guide)所需的足够权限,而用QUERYTRACEON/QUERYRULEOFF提示创建一个计划指导则需要sysadmin权限,因为改变这些设置也许有系统而非数据库范围的含义。

    结论

    最后,清楚你的环境中何时使用这些查询优化或查询调优技术很重要,请在使用这些技术前,分析具体情况并进行足够的测试。.

  • 相关阅读:
    写给大忙人的spring cloud 1.x学习指南
    spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)
    Spring-Data-Redis下实现redis连接断开后自动重连(真正解决)
    写给大忙人的nginx核心配置详解(匹配&重写、集群、环境变量&上下文、Lua)
    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 解决方法
    linux下配置nginx使用ftp目录作为静态资源文件的目标目录
    写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)
    linux下mysql 8.0安装
    写给大忙人的Elasticsearch架构与概念(未完待续)
    写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
  • 原文地址:https://www.cnblogs.com/lhdz_bj/p/9574541.html
Copyright © 2020-2023  润新知