MS SQL Server数据库查询优化技巧
【摘 要】本文主要是对MS SQL Server数据库查询优化技巧进行了说明和分析,对索引使用、查询条件以及数据表的设计等进行了阐述。
中国论文网 http://www.xzbu.com/2/view-3479336.htm
【关键词】数据库;查询;优化技巧
一、建立索引能够提高查询效率
在应用数据库的过程当中是否应用索引查询是一个具有争议性的话题,这主要是因为对数据库某列添加索引以后,在利用该索引对整个数据库进行查询的时候就只会在索引范围之内进行扫描,而不利用该索引对整个数据库进行查询时所进行的就是全表的扫描。在这样一种状况下,从性能的角度来看的话,目标表记录的总数是固定的,因此在查询结果比较少的时候索引查询的效率才会相对比较高,查询结果较多的时候索引查询的效率反而会比较低,正是因为这样,索引查询的应用与否才会成为一个具有争议性的问题。但在实际的应用过程当中,各种不同软件的应用目的不一,通常来说,记录数较少的表查询结果与记录数的比值偏大,甚至能够出现100%查询,但记录数少的表查询结果与记录数的比值则偏小,由此认为,至少应当对一些记录数比较多的数据库建立索引查询来实现查询效率的提高。
二、数据表设计对查询性能的影响分析
(1)空值比较。在对数据表进行定义的过程当中会涉及到数据列的空值问题,这主要是因为在实际的应用过程当中无疑会出现允许空值的状况,但在定义数据表时如果允许空值设置的话就会出现is null的查询条件。一旦is null查询条件出现后续的查询过程就是对全表进行的扫描而不是索引扫描,具体来说,int当中采用一些特殊的数字来作为默认值,而字符串当中则采用空串来作为默认值。(2)字符类型比较。MS SQL
Server2005当中共有六类字符串数据类型,包括:varbinary、binary、nvarchar、nchar、varchar、char。在这六个字符串数据类型当中,binary、nchar、char是固定长度的字符串,varbinary、nvarchar、varchar则是可变长度的字符串,在应用的过程当中不同类型也是可以互换使用的,因此要注意对其进行区分。
三、条件表达式性能优缺点分析
在进行数据查询的过程当中,查询结果在查询语句中的表达方式有多种,且不同表达方式所得到的查询效率有高有底,这也就是说,在进行条件表达式的编写时也需要根据查询结果的特点进行选择和应用,下面主要是结合常用的几种情况进行说明和分析。(1)!=或<>情况。我们在实际的查询过程当中应当尽可能的去避免不等条件的应用,这主要是因为一旦在查询过程当中使用不等条件就意味着后续查询过程只能够通过全面扫描来完成,索引扫描在其中是难以发挥作用的。通常情况下采用的是大于或小于的表达式来对不等条件进行表示。(2)Like情况。Like情况主要是应用于字符串的模糊查询,其具体的查询表达形式同样有多种:like a%、like%a和like a%a ,在这其中,只有likea%既能应用于索引扫描又能应用于全表扫描,like%a和likea%a只能进行全表扫描,正是因为这样,我们在进行选择和使用的时候就尽可能的避免后两种表达方式。但是,在一些目标列中字段过长的时候,检索方式会选择为全文检索,在这样一种情况下则还是选择like%a和likea%a更为合适。(3)in、not in 情况。在进行查询语言的设计时,in的用法包括两种,一种是后接条件集合,一种是后接子查询,下文中将对这样两种情况分别进行说明和分析。in后接条件集合,如果其数据量不大或者其对应条件无索引时,可以直接予以使用而不需要对其进行优化,相反,如果数据量较大或者其对应条件有索引时,就建议将所有的条件都集合起来,并为每一个条件都单独写sql语句,采用union或者是union all将所有的查询结果进行连接。在这里进一步说明union和union all之间的区别,union能够对查询结果进行有效的排序,并去除重复项,而union all则无此功能,在实际的应用过程当中就可以根据需要排序与否来进行选择和使用。In后接子查询时,目标表记录数量如果明显比子查询表记录数少的话就需要采用exists来代替in,必要的时候还可以在子查询当中建立索引。但需要注意的是,在一些能够直接使用连接查询方式的语句当中就尽可能的不要使用in,这主要是因为in语句相当于hash连接,其性能相对而言要低的多。Not in在任何状况下应用都不会使用索引,因此认为在一些数据量大的数据库当中尽量不要使用,而not exists的子查询则是可以应用索引扫描的,因此有必要的时候就可以直接采用not exists加索引来对其进行优化。
通过上文的说明和分析就可以看到,在进行数据库查询时往往是没有既定的方式和规则的,需要我们以查询效率为目的来进行创新、设计和尝试。
参 考 文 献
[1]王珊,萨师炫.数据库系统概述(第四版)[M].北京:高等教育出版社,2006
[2]李辉,王至邀.一种多条件分页查询优化方法的设计[J].计算机工程.2010(2)
MS SQL Server数据库查询优化技巧的更多相关文章
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- (火炬)MS SQL Server数据库案例教程
(火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...
- MS SQL Server数据库修复/MDF数据文件数据恢复/MDF质疑/mdf无法附加
微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MD ...
- MS SQL Server数据库在线管理工具
MS SQL Server数据库以其优异的性能,被广泛使用,特别是政务,医疗行业.但是远程维护挺不方便的,目前有一款基于WEB的工具TreeSoft数据库管理系统. 免安装,直接解压就可以用了.直接通 ...
- MS SQL Server 数据库分离-SQL语句
前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...
- SQL Server 数据库编程技巧
Ø 简介 本文主要介绍 SQL Server 数据库在平常的开发中,可能会涉及到的编程技巧,主要包含以下内容: 1. 解决 SQL Server 不支持 127.0.0.1 登录 2. 查询 ...
- MS Sql Server 数据库或表修复(DBCC CHECKDB)
MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令. 1. DBCC CHECKDB 重启服务器后,在没有进行任何操作的情况下,在SQL ...
- MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)
----------------- [1] use master go sp_configure reconfigure with override go ----------------- [2] ...
- MS SQL SERVER 数据库日志压缩方法与代码
MS SQL性能是很不错的,但是数据库用了一段时间之后,数据库却变得很大,实际的数据量不大.一般都是数据库日志引起的!数据库日志的增长可以达到好几百M. DUMP TRANSACTION [数据库名] ...
随机推荐
- 深度学习笔记(六)VGG14
Very Deep Convolutional Networks for Large-Scale Image Recognition 1. 主要贡献 本文探究了参数总数基本不变的情况下,CNN随着层数 ...
- 【bzoj5210】最大连通子块和 动态dp
动态$dp$好题 考虑用树链剖分将整棵树剖成若干条链. 设x的重儿子为$son[x]$,设$x$所在链链头为$top[x]$ 对于重链上的每个节点(不妨设该节点编号为$x$)令$f[x]$表示以$x$ ...
- OS之内存管理 ---基本的内存管理策略(二)
分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的 ...
- pygame游戏开发-简介
转自白月黑羽Python教程:http://www.python3.vip/doc/tutorial/python/game/ 推荐对Python有兴趣的童鞋可以关注去看看,教程语言平实,简单易懂. ...
- 酷派大神F2使用QPST进行nv备份恢复,解决无信号问题
测试机器: 大神F2联通版 8675_W00 系统COOLUI55 写贴原因: 自己无意间刷错了包,结果手机无信号,进入工程模式怎么设置都没有用.尝试过系统还原(备份过).刷新的ROM.线刷, ...
- android学习-Activity启动过程详解
注:只是说明启动activity的过程(ActivityThread如何与ActivityManagerService简称AmS进行进程间通信调用全过程),不解析android从zygote(受精卵) ...
- 深入理解Java虚拟机:第2章 Java内存区域与内存溢出异常
目录 2.2 运行时数据区域 Java堆 方法区 虚拟机栈 本地方法栈 程序计数器 2.3 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 2.2 运行时数据区域 Jav ...
- HTTP状态码列表
经常用的http状态码 1xx消息——请求已被服务器接收,继续处理2xx成功——请求已成功被服务器接收.理解.并接受3xx重定向——需要后续操作才能完成这一请求4xx请求错误——请求含有词法错误或者无 ...
- Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...
- elasticsearch(一):JAVA api操作
1.创建一个mavan项目,项目的以来配置如下. <?xml version="1.0" encoding="UTF-8"?> <projec ...