`

收藏整理—SQL Server查询优化(2)

阅读更多

(五)其他注意事项 

      “水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。

        所以说,我们要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,以使您的数据库能得到高性能的发挥。 

      当然,在实践中,作为一个尽职的数据库管理员,您还要多测试一些方案,找出哪种方案效率最高、最为有效。 

二、改善SQL语句 

      很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如: 

select * from table1 where name="zhangsan" and tID > 10000 和执行: select * from table1 where tID > 10000 and name="zhangsan" 

      一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的 10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name="zhangsan"的,而后再根据限制条件条件tID> 10000来提出查询结果。 

        事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。 

        虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。 

        在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。 

        SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下: 

列名 操作符 <常数 或 变量>或 <常数 或 变量> 操作符列名

列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如: 

Name=’张三’ 

价格>5000

5000 <价格

Name=’张三’ and 价格>5000 

        如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。 

介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验: 

1、Like语句是否属于SARG取决于所使用的通配符的类型 

如:name like ‘张%’ ,这就属于SARG 

而:name like ‘%张’ ,就不属于SARG。 

原因是通配符%在字符串的开通使得索引无法使用。 

2、or 会引起全表扫描 

Name=’张三’ and 价格>5000 符号SARG,而:Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。 

3、非操作符、函数引起的不满足SARG形式的语句 

      不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、 <>、! <、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子: 

ABS(价格) <5000 

Name like ‘%三’ 

有些表达式,如: 

WHERE 价格*2>5000 

SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为: 

WHERE 价格>2500/2 

但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。

4、IN 的作用相当与OR 

语句: 

Select * from table1 where tid in (2,3)和Select * from table1 where tid=2 or tid=3 

是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。 

5、尽量少用NOT 

6、exists 和 in 的执行效率是一样的 

很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。 

(1)        select title,price from titles where title_id in (select title_id from sales where qty>30)

(2)        该句的执行结果为: 

表 "sales"。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。 

表 "titles"。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。 

(2)select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)

第二句的执行结果为: 

表 "sales"。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。 

表 "titles"。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。 

我们从此可以看到用exists和用in的执行效率是一样的。 

7、用函数charindex()和前面加通配符%的LIKE执行效率一样 

        前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的: 

select gid,title,fariqi,reader from tgongwen where charindex("刑侦支队",reader)>0 and fariqi>"2004-5-5" 

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。 

select gid,title,fariqi,reader from tgongwen where reader like "%" + "刑侦支队" + "%" and fariqi>"2004-5-5" 

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。 

8、union并不绝对比or的执行效率高 

        我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。 

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi="2004-9-16" or gid>9990000 

用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi="2004-9-16" 

union 

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000 

用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。 

        看来,用union在通常情况下比用or的效率要高的多。 

      但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi="2004-9-16" or fariqi="2004-2-5" 

用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。 

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi="2004-9-16" 

union 

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where  fariqi="2004-2-5" 

用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。 

9、字段提取要按照“需多少、提多少”的原则,避免“select *” 

我们来做一个试验: 

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc 用时:4673毫秒 

select top 10000 gid,fariqi,title from tgongwen order by gid desc 用时:1376毫秒 

select top 10000 gid,fariqi from tgongwen order by gid desc 用时:80毫秒 

      由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。 

10、count(*)不比count(字段)慢 

某些资料上说:用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看:

select count(*) from Tgongwen 用时:1500毫秒 

select count(gid) from Tgongwen 用时:1483毫秒 

select count(fariqi) from Tgongwen 用时:3140毫秒 

select count(title) from Tgongwen  用时:52050毫秒 

      从以上可以看出,如果用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段 越长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。 

11、order by按聚集索引列排序效率最高 

我们来看:(gid是主键,fariqi是聚合索引列) 

select top 10000 gid,fariqi,reader,title from tgongwen 

用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。 

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc 

用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。

分享到:
评论

相关推荐

    2024-2030全球与中国盐氯化系统市场现状及未来发展趋势.docx

    2024-2030全球与中国盐氯化系统市场现状及未来发展趋势

    基于深度学习的积灰检测识别-图像分类源码+数据集.zip

    详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;

    沈阳药科大学-答辩通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    微信备忘录小程序源码 作业设计demo 计算机专业作业

    微信备忘录小程序源码 作业设计demo 微信备忘录小程序是一种便捷的个人记事应用,它允许用户在微信内快速记录和查看备忘录。以下是对微信备忘录小程序的简要介绍: --- **微信备忘录小程序** 微信备忘录小程序为用户提供了一个简单、直观的记事平台。用户可以通过这个小程序记录日常事务、重要提醒和个人笔记,非常适合忙碌的现代生活节奏。 主要特点包括: 1. **快速记录**:用户可以迅速添加文本、列表或语音备忘录。 2. **定时提醒**:为每个备忘录设置提醒时间,确保不会错过任何重要事项。 3. **个性化分类**:支持自定义分类,便于管理和查找备忘录。 4. **界面友好**:清晰的界面设计,操作简便,无需复杂的学习过程。 5. **数据同步**:通过微信账号登录,实现备忘录的云端同步,方便在不同设备间切换使用。 此外,小程序还具备以下优势: - **隐私保护**:备忘录内容仅对用户本人可见,保障个人隐私。 - **无广告干扰**:提供一个无广告的清爽记事环境。 - **离线存储**:即使在无网络环境下,也能正常使用,记录的内容会在联网后自动同步。 微信备忘录小程序是日

    中国海洋大学-汇报答辩专用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    毕业设计:python基于深度学习的交通标志识别系统(源码 + 数据库 + 说明文档) 太多存百度云盘

    毕业设计:python基于深度学习的交通标志识别系统(源码 + 数据库 + 说明文档) 2 开发工具及技术 2 2.1 B/S结构的介绍 2 2.2 PYTHON技术的介绍 2 2.3 HTML技术的介绍 2 2.4 MYSQL数据库的介绍 3 2.5 深度算法的介绍 3 2.6 开发环境的介绍 3 3 需求分析 4 3.1 可行性分析 4 3.2 功能需求分析 4 3.3 非功能需求分析 4 4 总体设计 6 4.1 系统总体结构设计 6 4.2 系统的数据库设计 6 5 系统功能实现 6 5.1 登录及注册 6 5.2 首页展示 6 5.3 个人信息 6 5.4 用户管理 6 5.5 修改密码 6 5.6 图片识别 6 5.7 摄像头识别 6 5.8 天气识别 6 6 系统测试 6 6.1 测试目的 6 6.2 测试内容 6 6.3 测试总结 6

    083ssm-vue汉服文化平台网站.zip(可运行源码+数据库文件+文档)

    本L文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述汉服文化平台网站的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 汉服文化平台网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、汉服知识管理、服装展示管理、服装类别管理、用户相册管理、论坛交流、系统管理、订单管理,用户:首页、个人中心、用户相册管理、论坛交流、我的收藏管理、订单管理,前台首页;首页、汉服知识、服装展示、用户相册、论坛交流、个人中心、后台管理、购物车、在线客服等功能。由于本网站的功能模块设计比较全面,所以使得整个汉服文化平台网站信息管理的过程得以实现。 本系统的使用可以实现汉服文化平台网站管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。 关键词:汉服文化平台网站 JAVA语言;MYSQL数据库;SSM 框架

    HTML5浪漫爱心表白动画在线演示程序

    HTML5浪漫爱心表白动画在线演示程序

    node-v13.12.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    实验3-关系运算设计(c语言编程).doc

    实验3-关系运算设计(c语言编程).doc

    对京东网站的分析(ppt文档).ppt

    对京东网站的分析(ppt文档).ppt

    C#本科毕业设计基于Unity3D引擎的网络角色扮演游戏设计与实现源代码.zip

    高分设计源码,详情请查看资源内容中使用说明 高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明

    2021数学建模美赛C题代码.zip

    最全的数学建模美赛C题和代码、大量刷题题库、逻辑清晰易于学习

    基于MATLAB的PCA算法人脸识别项目源码+GUI界面+说明文档.zip

    详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;

    上海交通大学-通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    办公自动化(OA)是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统,极大提高公司的办公效率.zip

    springboot框架 一、Spring Boot基础应用 Spring Boot特征 概念: 约定优于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。 特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值注入IOC容器。 3.自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们。 4.使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了

    市政交通信号工程检验批质量验收记录.doc

    市政交通信号工程检验批质量验收记录.doc

    浙江农林大学-答辩通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    工程监理企业信息化解决方案.doc

    工程监理企业信息化解决方案.doc

    工总承包企业特级资质标准信息化考评表.doc

    工总承包企业特级资质标准信息化考评表.doc

Global site tag (gtag.js) - Google Analytics