SQLServer数据查询的优化方法
SQLServer获取表的行数(优化)

SQLServer获取表的⾏数(优化)
⼀般当你有需求读取⼀个表是否存在记录或者表的⾏数时,⼀般都是⽤count(*),但是数据量太⼤时,⽤这种⽅式往往不合适(1)为了获得表中的记录数,我们通常使⽤下⾯的SQL语句:
SELECT COUNT(*)
FROM[dbo].[QuestionLibraryAnswer]
这条语句会执⾏全表扫描才能获得⾏数。
(2)但下⾯的SQL语句不会执⾏全表扫描⼀样可以获得⾏数:
SELECT rows FROM sysindexes
WHERE id =OBJECT_ID('[dbo].[QuestionLibraryAnswer]') AND indid <2
测试数据(8000条):
count(*)读取次数42次
优化后的读取次数2次
sysindexs 是对数据库⾥的数据表、索引的⼀个对应表.id 即是给它们定义的编号.
这句话的意思是查找’table_name‘这个表的数据总⾏数.
⽽indid是指它的指索引ID的类型: 0:堆 1:聚集索引 >1: ⾮聚集索引,⼀般情况下表的indid是0,所以加了⼀个 indid < 2。
SQLserver查询优化分析

摘
要
随着应 用 系统 中数据 量的增大 , 高数据 库管理 系统 S L,re 的查询和访 问数据 功能极 为必要 。 提 Q  ̄ vr e
本文就提 高 S Lsre 的查询优化 问题进行 一些分析。 Q evr 关键词 索引 视 图 异 步查询 中图 分 类 号 :P 1 T31
索引 , 以下一些情况 比较适合创建簇索引 : ①用于范 围查询 的列 ; ② 用于 O d r y G opB 查询 的列 ; re 或 ru y B ③用于连接操作 的列 ; ④返 回大量结果集 的查询 ; ⑤ 不经常修 改 的列 ( 对经 常变 动 的列 , 列值 修改 后 , 数
立索 引之后 ,Q E V R将根 据索引 的指示 , 接定位 到 S LS R E 直 需要查询 的数据 行 , 从而 加快 S L S R E Q E V R的数 据检 索操 作。这样利用索引可 以避免 表扫描 , 并减少 因查询而造成 的
IO开 销 。 /
般而言 , 对于一个表拥 有一个簇 索引 和 2~ 6个非簇 索 引
1 引 言
文献 标 识 码 : A
缩小 了查询 范围 , 提高 了查询速度 。 由于每个表 只能建一 个簇 索引 , 因此必须 明智地选择簇
在应 用系统 中 , 对数据查询及处理速度 已成 为衡 量应 用 系统成败 的标 准。数据库 管理 系统 S LS R E Q E V R由于其 强
维普资讯
第 9卷 第 3期
2007年 9 月
辽 宁 省 交 通 高 等 科 学 校 学 报 专
J OURNAL OF L1 AON1 PR NG OVI Al COl : 0F COMMUN1 ATI NCI 上iGE C ONS
当SqlServer数据量很大时,如何优化表格能加快处理速度

表设计和查询的一些参考1.合理使用索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。
现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。
索引的使用要恰到好处,其使用原则如下:●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
● 使用系统工具。
如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。
在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。
另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序应当简化或避免对大型表进行重复的排序。
当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。
以下是一些影响因素:●索引中不包括一个或几个待排序的列;●group by或order by子句中列的次序与索引的次序不一样;●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。
如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。
比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。
SQLServer数据库性能调优技巧

SQLServer数据库性能调优技巧第一章:SQLServer数据库性能调优概述SQLServer是一种常用的关系型数据库管理系统,在大型企业和云计算环境中广泛应用。
为了确保数据库的高性能和可靠性,进行数据库性能调优非常重要。
本章将介绍SQLServer数据库性能调优的概念和目标。
1.1 数据库性能调优的概念数据库性能调优是指通过分析和优化数据库的结构、查询、索引、存储和配置等方面的问题,以提高数据库系统的效率和性能。
优化数据库性能可以显著提升数据的访问速度、减少系统响应时间和提高数据库的处理能力。
1.2 数据库性能调优的目标数据库性能调优的主要目标是提高数据库的运行效率和用户的体验,具体目标包括:- 提高数据的访问速度:通过合理的查询优化和索引设计,加快数据的检索速度。
- 减少系统响应时间:通过调整数据库配置、优化SQL 查询和提高硬件性能等措施,缩短系统响应时间。
- 提高数据库的处理能力:通过合理的分区设计、并行处理和负载均衡等措施,提高数据库的并发处理能力。
第二章:SQLServer数据库性能调优基础在进行SQLServer数据库性能调优之前,有几个基础概念需要了解,包括数据库的结构、查询执行计划和索引等。
2.1 数据库的结构SQLServer数据库由多个表组成,每个表由多个行和列组成。
表有一定的关系,通过主键和外键来建立关联。
了解数据库的结构对于进行性能调优非常重要。
2.2 查询执行计划查询执行计划是SQLServer数据库执行查询语句时的执行路径和操作过程的详细描述。
通过分析查询执行计划,可以找到潜在的性能问题,并进行相应的优化。
2.3 索引索引是一种特殊的数据库对象,用于加快查询速度。
常见的索引类型包括聚集索引、非聚集索引和全文索引等。
合理设计索引可以提高查询的性能。
第三章:SQLServer数据库性能调优技巧本章将介绍一些常用的SQLServer数据库性能调优技巧,包括查询优化、索引优化、配置优化和硬件优化等。
SQL Server 2005 SQL查询优化

SQL Server 2005SQL 查询优化目录SQL Server 2005:SQL查询优化 .............................................................................................. 错误!未定义书签。
实验安装 (44)练习一:使用SQL Server Profiler工具解决死锁问题 (5)练习二:使用SQL Server Profiler工具隔离运行速度慢的查询语句 (9)练习三:检查执行计划 (11)练习四:使用数据库引擎优化顾问工具(Database Tuning Advisor) (12)SQL Server 2005 SQL查询优化目标注释:本实验侧重于这个模块中的概念,因此不必遵循微软的安全建议。
注释:SQL Server 2005的最新详细资料, 请访问/sql/.完成本实验之后, 你可以实现以下目标:▪使用SQL Server Profiler工具解决死锁问题▪为一个低性能查询制定一个查询计划,并将它以XML格式的文档保存。
▪使用数据库引擎优化顾问工具(Database Tuning Advisor)场景假设你是AdventureWorks数据库的数据库管理员.你的数据库用户经常遇到死锁问题而且你很关心死锁是不是导致系统性能低的一个原因。
你已经隔离了一个经常与死锁有关的查询。
你将使用SQL Server Profiler工具来跟踪导致死锁的事件并详细记录死锁的信息。
追踪到死锁的原因之后,你发现这个原因并不是导致系统性能下降的主要原因,所以你决定检查那些关键的查询。
通过检测为那些关键查询制定的查询计划来分析它们,然后你可以使用索引优化顾问工具来提出最适当的索引。
前提条件▪SQL Server 2000管理任务的基本经验▪熟悉T-SQL语言▪完成SQL Server Management Studio 的动手实验。
基于SQLServer数据库查询优化的探讨

1 、 引 言
生 活和 工作 越来越 离不 开计 算 机 .每天 都 和 大量 值 两方 面 的。 根 据索 引存 储 的位 置不 同 , 索引一 般 的数 据 打交 道 。数 据库技 术 的发 展 已经 成 为一 个 分 为 2类 . 聚集索 引 ( c l u s t e r e d i n d e x ) 和 非 聚集 索 国家综合 实 力 的指 标 . 目前 . 绝 大多 数 的数 据库 都 引f n o n c l u s t e r e d i n d e x ) m 。聚集 索引是使 基本 表 中数 是关 系数 据库 系统 .而查 询 操作 是 我们 每 天几乎 据按 照 索引 的顺序 存储 .一个 表 只能有 一个 聚 集 都要 用 到 .查 询速 度 的快 与 慢将 直 接影 响 我们 工 索 引 .比如我 们经 常使 用 的汉语 字典 正文 就是 一 作 的效率 .而且现今 数据 库 系统 的信 息 都是 海 量 个 聚集 索 引 . 它前 面 的 目录是 按 照字母 “ A” 到“ Z ” 查找一个“ 高” 字 就 翻到 拼 音 的“ G” 开 头 存储 的 , ( 比如 银 行 、 电信 ) , 对 这 些 信 息 的查 询要 排 列 的 . 求 我们 的速度 要实 时 。 于是如 何设 计 数据 库 . 采取 的部 分 .如果 在这 里没有 找 到就说 明字 典没 有这 什么 样 的查询 方法 , 提 高查 询 速度 , 这 就 是查 询优 个字 。 非聚 集索 引是 数据存储 在一 个地方 。 索引 存 化要 解决 的问题 在 另一个 地方 .索 引带 有指针 指 向数据 的存 储 位 2 、 查 询优 化 的准则【 1 】 置 同样 我们 查 找一个 字如果 我 们认识 它 就用 拼 ( 1 ) 选 择运算 尽量 先做 。这 是 最重 要 、 最 基本 音查 找 . 如果 不认 识 就用 “ 偏旁 部 首” 查找 . 然 后 根 的一 条 .因为 这样会 使执 行 的 时间缩 短 几个 数量 据这 个 字后 面 的页码查 找到该 字 级。 会使 中间 的结 果大 大变小 。 建立 索 引 的原 则是 : 1 )在 查 询频率 较 高或 经 ( 2 ) 在 执行 连接前 对关 系适 当的预处 理 。 比如 常 过滤 条 件 的字 段上 建 立 索 引 : 2 ) 在S O L语 句 中 对 关 系建 立索 引 , 它能快 速查 找 到需要 的数据 。 经 常进 行 G R O U P B Y、 O R D E R B Y 字 段 上 建 立 索 f 3 )如果 对 同一个关 系进 行 投影 和选 择 运算 引 ; 3 ) 在经 常 存储 的多个 字 段上 建立 索 引 ; 4 ) 在 外 时。 应将 他们 同时 进行避 免重 复 扫描 。 键上 建立 索引 , 因为外 键是 联系 两个 表 的纽带 ; 5 ) ( 4 ) 如果 有连 接和选 择 运算 时 . 尽 量 把他 们统 般 选择 数据 量大 的表 建立 索引 : 6 )不 应在 存储 起来 , 特别 是 等值连接 。 值很 少 的字段 建 立 索 引 . 如在 “ 性别 ” 字 段 不 应建 ( 5 ) 找 出公共 子表 达式 。 如 果 这 种 重 复 出 现 的 立索 引 : 7 ) 对 于经 常更 新 的字段 不应建立 索 引 。 表 达式 与结 果不 是很 大 的关 系 .并 且 从外 存 中读 合理 建立 索 引是能 提高检 索 速度 .但是 过 多 人 这 个关 系 比计 算 该子 表 达 式 的 时 间少 的多 . 则 的索 引会 导致 系统性 能 降低 。增加 一个 索 引系 统 先 计算 一 次公共 子表 达式 并把 结果 写 入 中 间文件 就要 来维 护它 . 过 多 的索引还 会产 生索 引碎 片 尤 是 合算 的 。 当查询视 图时 , 定 义视 图的表 达式 就是 其 对 于非 聚集 索 引 的建立 要特 别 注意 .既要 达 到
sqlserver数据库 提高效率方法

SQL Server 数据库是一种常见的关系型数据库管理系统,它被广泛应用于企业级应用程序和数据管理系统中。
然而,随着数据库规模的增大和日常操作的复杂性增加,数据库的性能和效率往往成为关注的焦点。
提高SQL Server数据库的效率不仅可以显著改善系统的响应速度和稳定性,也可以节约资源和降低成本。
本文将介绍一些提高SQL Server 数据库效率的方法,帮助管理员和开发人员更好地管理和优化数据库系统。
1. 使用合适的索引索引是数据库中用来加快对表中数据的访问速度的结构,它可以通过创建索引来优化查询的性能。
在SQL Server中,通过对经常进行搜索,排序和过滤的数据列创建合适的索引,可以显著提高查询性能。
定期对索引进行维护和优化也是提高数据库效率的关键步骤。
2. 优化查询语句优化SQL查询语句对于提高数据库效率至关重要。
在编写查询语句时,应避免使用全表扫描,尽量减少数据量,避免使用不必要的连接和子查询,合理使用排序和分组等操作,以及避免使用模糊查询和通配符查询等低效操作。
3. 定期备份和恢复定期备份数据库是保障数据库安全的重要手段,同时备份还能够减少数据库维护的风险。
在备份时,管理员应该选择合适的备份策略,并对备份文件进行存储和管理,以确保数据库在出现故障或灾难时能够快速恢复。
4. 使用存储过程和触发器存储过程和触发器是SQL Server中重要的数据库对象,它们可以提高数据库的安全性和可维护性,同时还能减少网络流量和客户端执行开销,提高数据库的效率。
在编写存储过程和触发器时,应遵循一些最佳实践,如避免多次嵌套存储过程和触发器,减少对数据库的锁定和阻塞。
5. 使用物理分区技术SQL Server支持对数据表进行物理分区,这可以帮助管理员更好地管理数据,并根据需求对数据进行调优。
通过物理分区,可以提高查询和数据加载的性能,同时也方便了数据备份和恢复。
总结通过上述方法,可以显著提高SQL Server数据库的性能和效率,使其能够更好地满足企业应用程序和数据管理系统的需求。
SqlServer中百万级数据的查询优化

SqlServer中百万级数据的查询优化万级别的数据真的算不上什么⼤数据,但是这个档的数据确实考核了普通的查询语句的性能,不同的书写⽅法有着千差万别的性能,都在这个级别中显现出来了,它不仅考核着你sql语句的性能,也考核着程序员的思想。
公司系统的⼀个查询界⾯最近⾮常慢,界⾯的响应时间在6-8秒钟时间,甚⾄更长。
检查发现问题出现在数据库端,查询⽐较耗时。
该界⾯涉及到多个表中的数据,基本表有150万数据,关联⼦表的最多的⼀个700多万数据,其它表数据也在⼏⼗万到⼏百万之间。
其实按这样的数据级别查询响应时间应该在毫秒级内,不应该有这么长时间。
那么接下来就该进⾏问题排查了。
由于这个这界⾯的功能主要是信息检索,查询⽐较复杂,太多的条件组合,使⽤存储过程太多的局限性,因此查询使⽤的是动态拼接的sql 语句。
查询⽅式是最常⽤的1、获取数据总数2、数据分页。
直接上代码(部分条件)。
select numb=count(distinct t1.tlntcode)from ZWOMMAINM0 t1 inner join ZWOMMLIBM0 t2 on t1.tlntcode=t2.tlntcodejoin ZWOMEXPRM0 cp on t1.tlntcode=cp.tlntcodejoin ZWOMILBSM0 i on i.tlntcode=t1.tlntcodejoin ZWOMILBSM0 p on p.tlntcode=i.tlntcodejoin ZWOMILBSM0 l on l.tlntcode=i.tlntcodewhere isnull(t2.deletefg,'0')='0' and panyn like '%IBM%' and cp.sequence=0and i. mlbscode in('i0100','i0101','i0102','i0103','i0104','i0105','i0106') and i.locatype='10'and p.mlbscode in('p0100','p0102','p0104','p0200','p0600') and p.locatype='10'and l.mlbscode in('l030') and l.locatype='10'查看执⾏时间根据提⽰得知,整个查询耗时花费在了分析和编译为4秒,执⾏为0.7秒。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQLServer数据查询的优化方法聂文燕摘要:SQLServer是一种功能强大的数据库管理系统,许多数据库应用系统都是以它作为后台数据库。
本文在分析影响SQLSERVER数据查询效率的因素的基础上,提出了几种优化数据查询的方法。
关键词:SQLServer,数据,查询,优化一、引言SQLServer是是由微软公司开发的基于Windows操作系统的关系型数据库管理系统,它是一个全面的、集成的、端到端的数据解决方案,为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。
目前,许多中小型企业的数据库应用系统都是用SQLServer作为后台数据库管理系统设计开发的。
设计一个应用系统并不难,但是要想使系统达到最优化的性能并不是一件容易的事。
根据多年的实践,由于初期的数据库中表的记录数比较少,性能不会有太大问题,但数据积累到一定程度,达到数百万甚至上千万条,全面扫描一次往往需要数十分钟,甚至数小时。
20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。
如果用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟。
而且我们知道,目前数据库系统应用中,查询操作占了绝大多数,查询优化成为数据库性能优化最为重要的手段之一。
二、影响查询效率的因素SQLServer处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给SQLServer的查询优化器,查询优化器通过检查索引的存在性、有效性和基于列的统计数据来决定如何处理扫描、检索和连接,并生成若干执行计划,然后通过分析执行开销来评估每个执行计划,从中选出开销最小的执行计划,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。
所以,SQLServer中影响查询效率的因素主要有以下几种:1.没有索引或者没有用到索引。
索引是数据库中重要的数据结构,使用索引的目的是避免全表扫描,减少磁盘I/O,以加快查询速度。
2.没有创建计算列导致查询不优化。
3.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。
4.返回了不必要的行和列。
5.查询语句不好,没有优化。
其中包括:查询条件中操作符使用是否得当;查询条件中的数据类型是否兼容;对多个表查询时,数据表的次序是否合理;多个选择条件查询时,选择条件的次序是否合理;是否合理安排联接选择运算等。
三、SQLServer数据查询优化方法3.1建立合适的索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。
当根据索引码的值搜索数据时,索引提供了对数据的快速访问。
事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。
索引的使用要恰到好处,其使用原则有:(1)对于基本表,不宜建立过多的索引;(2)对于那些查询频度高,实时性要求高的数据一定要建立索引,而对于其他的数据不考虑建立索引;(3)在经常进行连接,但是没有指定为外键的列上建立索引;(4)在频繁进行排序或分组(即进行groupby或orderby操作)的列上建立索引;(5)在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度;(6)如果待排序的列有多个,可以在这些列上建立复合索引。
在SQLServer中,索引按索引表达式包含的列分为单列索引和复合索引。
检查查询语句的where子句,因为这是优化器重要关注的地方。
包含在where里面的每一列都是可能的侯选索引,为能达到最优的性能,例如:对于在where子句中给出了column1这个列,下面的两个条件可以提高索引的优化查询性能!第一:在表中的column1列上有一个单索引;第二:在表中有多索引,但是column1是第一个索引的列。
避免定义多索引而column1是第二个或后面的索引,这样的索引不能优化服务器性能。
例如:下面的例子用了pubs数据库。
SELECTau_id,au_lname,au_fname FROMauthorsWHEREau_lname=‟White‟按下面几个列上建立的索引将会是对优化器有用的索引au_lname au_lname,au_fname而在下面几个列上建立的索引将不会对优化器起到好的作用au_address au_fname,au_lname在SQLServer中,索引按存储结构分为聚簇索引和非聚簇索引。
聚簇索引是按照定义数据列值的顺序在物理上对记录排序,在一个表上只能有一个聚簇索引,聚簇索引查询速度较快,但缺点是对表进行修改操作时速度较慢,因为为了保证表中记录的物理顺序与索引的顺序一致,必须将记录插入到数据页的相应位置,从而数据页中的数据必须重排。
在下面的几个情况下,可以考虑用聚簇索引:(1)某列包括的不同值的个数是有限的(但是不是极少的)。
如顾客表的州名列有50个左右的不同州名的缩写值,可以使用聚簇索引。
(2)对返回一定范围内值的列可以使用聚簇索引,如用between,>,>=, Select*fromsal eswhereord_datebetween‟5/1/93‟and‟6/1/93‟(3)对查询时返回大量结果的列可以使用聚簇索引。
SELECT*FROMphonebookWHERElast_name=‟Smith‟当有大量的行正在被插入表中时,要避免在本表一个自然增长(例如,identity列)的列上建立聚簇索引。
如果你建立了聚簇的索引,那么insert的性能就会大大降低。
因为每一个插入的行必须到表的最后,表的最后一个数据页。
非聚簇索引指定表中的逻辑顺序,一个表上可以建立多达249个非聚簇索引,它查询的速度比不建立索引快,但比聚簇索引慢,插入数据比聚簇索引快,因为纪录直接被追加到数据末尾。
可以在以下情况下考虑使用非聚簇索引。
(1)在有很多不同值的列上可以考虑使用非聚簇索引,如employee表中的emp_id列可以建立非聚簇索引。
(2)查询结果集返回的是少量或单行的结果集。
例如select*fromemployeewhereemp_id=‟pcm9809f‟(3)查询语句中orderby子句的列上可以考虑使用非聚簇索引。
3.2常用的计算字段(如总计、最大值等)可以考虑存储到数据库实体中。
例如仓库管理系统中有材料入库表,其字段为:材料编号、材料名称、型号,单价,数量…,而金额是用户经常需要在查询和报表中用到的,在表的记录量很大时,有必要把金额作为一个独立的字段加入到表中。
这里可以采用触发器以在客户端保持数据的一致性。
3.3用where子句来限制必须处理的行数。
在执行一个查询时,用一个where子句来限制必须处理的行数,除非完全需要,否则应该避免在一个表中无限制地读并处理所有的行。
例如:||| select qty from sales where stor_id=‟7131‟是很有效的,比无限制的查询selectqtyfromsales有效,避免给客户的最后数据选择返回大量的结果集。
当然也可以用TOP限制返回结果集的行数。
3.4尽量使用数字型字段。
一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
3.5查询语句的优化。
对于一条复杂的查询语句来说,对相同查询条件的实现一般总可以有多种不同的表达方法,而不同的表达会使数据库的响应速度大相径庭。
据统计,约有80%以上的性能问题是由于使用了不恰当的查询语句造成的,因此SQL语句的质量对整个系统效率有重大关系。
下面介绍查询语句优化方面的一些技巧:(1)避免使用不兼容的数据类型。
例如float和int、char和varchar、binary和varbinary是不兼容的。
数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。
例如: SELECTnameFROMemployeeWHEREsalary>60000在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。
这条语句可以改为:SELECTnameFROMemployeeWHEREsalary>$60000(2)尽量避免在Where条件里使用非聚合表达式,因为非聚合表达式很难利用到索引,通常SQLServer 不得不进行大规模的扫描。
像!=或<>、ISNULL或ISNOTNULL、IN,NOTIN等这样的操作符构成的表达式都是非聚合表达式。
非聚合表达式会导致查询效率大大降低。
例如: SELECTidFROMemployeeWHEREid!='B%'优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
(3)尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
如:SELECT*FROMemployeeWHEREsalary/2=100应改为:SELECT*FROMemployeeWHEREsalary=100*2SELECT*FROMemployeeWHERESUBSTR ING(emp_id,1,3)=‟PCM‟应改为:SELECT*FROMemployeeWHEREemp_idLIKE…5378%‟SELECTmember_number,first_name,last_nameFROMmembersWHEREDA TEDIFF(yy,datofbirth,GETDATE())>21应改为:SELECT member_number,first_name,last_name FROM members WHERE dateofbirth即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
(4)避免使用LEFTJOIN SQL的一个有价值的常用功能是LEFTJOIN。
它可以用于检索第一个表中的所有行、第二个表中所有匹配的行、以及第二个表中与第一个表中不匹配的所有行。
例如,如果希望返回每个客户及其定单,使用LEFTJOIN则可以显示有定单和没有定单的客户。
LEFTJOIN消耗的资源非常之多,因为它们包含与NULL(不存在)数据匹配的数据。
因此在构造查询语句时尽量避免使用LEFTJOIN。
(5)尽量避免在索引过的字符数据中,使用非打头字母搜索。