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权限,因为改变这些设置也许有系统而非数据库范围的含义。
结论
最后,清楚你的环境中何时使用这些查询优化或查询调优技术很重要,请在使用这些技术前,分析具体情况并进行足够的测试。.
SQL Server查询优化中的两个选项的更多相关文章
- SQL Server 索引中include的魅力(具有包含性列的索引)
2010-01-11 20:44 by 听风吹雨, 22580 阅读, 24 评论, 收藏, 编辑 开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”. [ ...
- SQL Server 内存中OLTP内部机制概述(四)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...
- SQL Server 索引中include的魅力(具有包含性列的索引)(转载)
开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”. [索引覆盖] 如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不 ...
- SQL Server 2000中的并行处理和执行计划中的位图运算符
SQL Server 2000中的并行处理和执行计划中的位图运算符 摘抄自:SQLServer 2000并行处理和位图简介 刘志斌 并行查询介绍Degree of Parallelism(并行度) 一 ...
- SQL Server 2008中的Hints(提示)的简单整理
SQL Server的系统查询过程 负责在SELECT查询执行时候产生查询执行计划.SQL Server会“智能”地选择一个高效计划来取代低效的一个.大多数时候,SQL Server会把这份工作干得很 ...
- SQL Server 查询优化 索引的结构与分类
一.索引的结构 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情 ...
- SQL Server 2005 中的分区表和索引
SQL Server 2005 中的分区表和索引 SQL Server 2005 69(共 83)对本文的评价是有帮助 - 评价此主题 发布日期 : 3/24/2005 | 更新 ...
随机推荐
- git项目,VSCode显示不同颜色块的含义
一. 概念 代码里的左侧颜色标识: 红色,未加入版本控制; (刚clone到本地) 绿色,已经加入版本控制暂未提交; (新增部分) 蓝色,加入版本控制,已提交,有改动: (修改部分) 白色,加入版本控 ...
- Linux——vi的使用
记录一下vi的一些使用指令,蓝色部分是比较常用的,其中使用过的重新进行了描述,极少部分是未使用过的,还有一些未使用也未记录进来,后续再来补充修正: 参考资料:http://cn.linux.vbird ...
- FZU oj 2277 Change 树状数组+dfs序
Problem 2277 Change Time Limit: 2000 mSec Memory Limit : 262144 KB Problem Description There is ...
- docker 日志分析
日志分两类,一类是 Docker 引擎日志:另一类是 容器日志. Docker 引擎日志 Docker 引擎日志 一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (Ce ...
- 微信小程序 数据绑定方式
与vue不同,在微信小程序中,js的数据和前端显示的数据是单数据流,也就是说,js里边的数据变了(通过setData),前端能立刻显示.但如果前端数据变了,js中的变量不能改变. 这个相比传统的前端已 ...
- Linux下的压缩解压缩命令详解及实例
实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ====================== ...
- 学习笔记2—MATLAB的copyfile技巧
clearclc %一.新建文件夹,%二.将原始路径下的数据剪切到新建文件夹中 path = ('E:\DFC_DMN_ASD_DATA_res\Cluster_hcc\4,6,8\Cluster_6 ...
- 第 8 章 容器网络 - 057 - macvlan 网络隔离和连通
macvlan 网络隔离和连通 验证 macvlan 之间的连通性. bbox1 能 ping 通 bbox3,bbox2 能 ping 通 bbox4. 即:同一 macvlan 网络能通信. bb ...
- spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关)
spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关) zuul: routes: #路由配置表示 myroute1: #路由名一 path: ...
- No address associated with hostname
java.net.UnknownHostException: Unable to resolve host "www.baidu.com": No address associat ...