查询优化(1)

--最近在看Inside Microsoft SQL Server 2005:Query Tuning and Optimization一书。其中有一段内容感觉归纳得不错,纠正了我以前的一些错误概念。

对查询我们可以从以下几个方面来考虑进行优化。

重写查询语句

  • 除了尽量避免太复杂的谓词判断,我们还需要尽可能避免使用outer joins,cross apply,outer apply,correlated scalar subqueries(关联标量子查询)或其他太过复杂的子查询。
  • 在某些情况下,把查询中的非关联标量子查询分离为一个独立的查询,并把此独立查询的结果保存在一个变量中供后续查询使用将会对整个查询的性能有所帮助。这样做还可能对使用并行执行计划带来帮助。
  • 尽量避免在并行执行计划中使用dynamic index seeks动态索引查找。

注:什么是Dynamic Index Seeks

比较以下2个查询的执行计划,其中第2个查询使用了Dynamic Index Seeks

--在Northwind中测试
--查询1
SELECT [OrderId]
FROM [Orders]
WHERE [ShipPostalCode] IN (N'05022', N'99362')--查询2
DECLARE @SPC1 nvarchar(20), @SPC2 nvarchar(20)
SELECT @SPC1 = N'05022', @SPC2 = N'99362'
SELECT [OrderId]
FROM [Orders]
WHERE [ShipPostalCode] IN (@SPC1, @SPC2)
  • 尽可能使用inline table-valued functions(内联表值函数)代替multistatement TVFs(多语句表值函数)。特别应避免对参数化的多语句表值函数进行cross apply。
  • 尽可能使用基于集合操作的查询,避免使用游标。

优化Schema

  • 如果对于一个高选择性的谓词,执行计划仍使用索引扫描或表扫描,我们应考虑增加一个合适的索引来使优化器使用索引查找。对于使用nested loops join的查询,可考虑给连接的内层表加上合适的索引。一个执行计划如果由于含有bookmark lookup而开销很大时,可以考虑通过增加一个索引来覆盖所有需要取出的列。
  • 如果查询计划中的merge join或stream aggregate之前有sort运算符,我们可以考虑增加一个索引来提供需要的排序。如果有可能的话,尽量创建一个唯一索引或约束,这样优化器会选择使用一对多的merge join代替多对多的merge join。尽可能使创建的唯一索引包含最少的列。
  • 考虑创建合适的外键,NOT NULL和CHECK约束。外键约束能简化连接,把一些outer或semi joins转化为inner joins(或把一个full outer join转化为一个left或right outer join)。Check约束也能减少一些多余的谓词。
  • 尽可能避免把两张表中的不同类型的数据列进行连接。特别需要避免主键和外键的数据类型不符。连接不同类型的数据列可能会使SQL Server无法使用index seeks,降低查询性能,也可能引起语义错误。

转载于:https://www.cnblogs.com/DBFocus/archive/2010/06/10/1755320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java二分法查找法算法_算法二:二分法查找(java语言)

说明:二分法查找* 解析:* 一维数组,二分法查找:假如有一组数为1,2,3,4,5,6,7,8,9,10要查给定的值7.* 可设三个变量low,mid,high分别指向数据的前,中间和后,mid(lowhigh)/2.* 注意&am…

四十大经(八正道)

中部117、四十大经 我听到这样: 有一次,世尊住在舍卫城祇树给孤独园。 在那里,世尊召唤比丘们:“比丘们!” “尊师!”那些比丘回答世尊。 世尊这么说: “我将教导你们圣正定的助伴、资粮&…

[原创]在windows下搭建基于apache的SVN环境

[原创]在windows下搭建基于apache的SVN环境 1 软件下载: 在http://httpd.apache.org/download.cgi,下载: apache_2.2.14-win32-x86-openssl-0.9.8k.msi 在 http://subversion.tigris.org/,下载: Setup-Subversion-1.6.…

java 线程不足_Java 线程基础知识

wait() 和notify()、notifyAll()这三个方法用于协调多个线程对共享数据的存取,所以必须在 Synchronized 语句块内使用这三个方法,否则会抛出错 IllegalMonitorStateException。前面说过 Synchronized 这个关键字用于保护共享数据,阻止其他线程…

16.Python略有小成(内置模块Ⅱ)

Python(内置模块Ⅱ) 一、规范化开发 一个py文件中 文件加载问题代码可读性,查询差要将一个py文件分开,合理的分成多个py文件 配置文件放在一起 : 一些轻易不改变的变量,一般命名 settings.py主逻辑函数放在一起 : 一般命名 src.py辅助功能函数放在一起 : 公共组件部分,装饰器,l…

java8 入门脚本之家_Java 8中的Lambda表达式

我想使用lambda表达式而不是for循环生成数字列表.所以让我们想要生成一个100以下的所有三角形数字的列表.三角数字是以下公式的数字:(n * n n)/ 2这样做最好的方法是什么?目前我有这个:Stream.iterate(1,n -> n 1).limit(100).map(n ->…

[原]nasm语法

工具:nasm 汇编gcc 编译cld 进行链接kscope 查看源代码make 工程管理khexedit 分析二进制文件一:nasm源文件布局:像其他汇编器一样, nasm源文件包含四个域的组合。(除了宏, 或者预编译器指示, 或者汇编…

matlab的算法java_matlab环境下的回归算法分析

嗨,我想对回归技术进行全面分析,因此将继续编辑这个问题 . 我正在尝试使用Matlab中提供的技术来解决回归问题 . 理想情况下,我想看看诸如此类的技巧线性回归Logistic回归贝叶斯回归支持向量回归回归的高斯过程问题陈述给定数据 X 和 Y &#…

C#仿QQ皮肤-常用用户控件EnterFrom1和窗体EntryForm的实现

导读部分 ------------------------------------------------------------------------------------------------------------- C#仿QQ皮肤-实现原理系列文章导航 最新版源码下载 http://www.cckan.net/thread-2-1-1.html 本次是我们窗体实现的最后一节&#xff0c…

idea中删除java类并提交_IDEA 删除java类的3种提示

1. 点击 delete 删除文件时,会弹出如下选项:Safe delete (with usage search)Search in comments and strings“Safe delete ( with usage search)”, 字面意思是使用搜索安全删除. 是否选中结果分别为:没有选中状态,直接删除.选中状态,删除前IDEA会搜寻…

S3C2440、S3C2450和S3C6410之间区别

S3C2440:  主频400MHz;  SDRam内存控制器;  支持Nor Flash和Nand Flash(SLC)  支持2种Flash启动;  内部LCD、I2C、Camera等控制器。 S3C2450:  主频533MHz;  双总线架…

mysql指定时间_MySQL查询指定时间的数据

MySQL查询指定时间的数据。亲测可用。

助教小结13

本周总结: 主要为完成团队任务五的批改 整体完成的还可以 第1组、第9组:未点击提交按钮总成绩打八折 优秀作业: 第5组:https://www.cnblogs.com/lishuya/p/11088462.html 千帆竟发图: 转载于:https://www.cnblogs.com/…

Oracle多表连接查询

多个表之间关系:一对多|(多对一) 多对多 一对一 3种 关系的完整性约束:实体完整性、参照完整性、用于定义的完整性。 必须满足实体完整性和参照完整性. 实体完整性:规定了字段|属性的约束 参照完整性:关系与关系之间的引用 某个字…