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 | 更新 ...
随机推荐
- Java—网络编程基础
URL的应用: 获得网页源代码可以用字节流.字符流,流的获取可以用url.openStream(),也可以用con.getInputStream(): 字节流: URL url = new URL(& ...
- 前端调用后端接口下载excel文件的几种方式
今天有一个导出相应数据为excel表的需求.后端的接口返回一个数据流,一开始我用axios(ajax类库)调用接口,返回成功状态200,但是!但是浏览器没有自动下载excel表,当时觉得可能是ajax ...
- Linux 服务器 安装 goflyway
github官方开发主页:https://github.com/coyove/goflyway goflyway的用途就不说了,你能搜到此文章就说明已经知道了. centos和Ubuntu均可使用,其 ...
- codeforces gym 101164 K Cutting 字符串hash
题意:给你两个字符串a,b,不区分大小写,将b分成三段,重新拼接,问是否能得到A: 思路:暴力枚举两个断点,然后check的时候需要字符串hash,O(1)复杂度N*N: 题目链接:传送门 #prag ...
- JaveWeb 公司项目(2)----- 类模态窗口显示DIV并将DIV放置在屏幕正中间
上一篇博客写的是通过隐藏显示进行div的替换,接下来需要在原有的div前添加一个div,进行表单的提交,需要将div放置在正中间,然后类似C#中的模态窗口,在进行完新弹出的div操作之后,才可以进行下 ...
- js中setTimeout和clearTimeout的使用
setTimeout,延迟n秒后执行指定代码 clearTimeout,清除计时器 <html> <head> <script type="text/javas ...
- Cannot find a valid baseurl for repo: base/7/x86_6 解决方法
安装centos7后发现不能上网, sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ONBOOT=no改为ONBOOT=yes 然后重启网络服务 ...
- selenium打开chrome时,出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors""
from selenium import webdriveroptions = webdriver.ChromeOptions()options.add_experimental_option(&qu ...
- Spring boot @Scheduled(cron = "* * * * * *") cron表达式详解
//@Scheduled(cron = "0 0/15 * * * ?") //每15分钟触发一次 //@Scheduled(cron = "5/10 * * * * ? ...
- GZip对字符串压缩和解压
/// <summary> /// 压缩 /// </summary> /// <param name="value">需要压缩字符串</ ...