浅谈数据库中 SQL语句的优化
◆ 王英 杰 梁 晓强
(石家庄信 息工程职业学院 )
【摘 要】影 响数 据库性 能的一个重要 因素就是查询 语 句的低 效率 ,
为 了提 高数据 库 系统的性能 ,对 SOL语 句进行 优化也就是将性 能
低下的 SQL语 句转换成功 能相 同但性 能优 异的 SQL语 句 ,通 过对
优化 方法和技 巧的研 究提 高 sQL语 句的效率 ,在一定程度上 也就
提 高了查询 的效率。
【关键 词】优化 SOL语 句优 化 查询
一
个数据库系统 的生命周期可 以分为:设计 、开发 、成 品三个阶
段 。而在设计阶段就对数据库 的性 能进行 优化则成本最低 ,收益最
大 ;而在成 品阶段 时再对 数据库进行 性能优化 则成本最 高,收益却
最 小。对数据 库性 能优化通 常可 以通 过对网络、硬件 、操作 系统、数
据库 参数 和应用程 序的优化来进 行。最 常见的优化手段就 是对硬件
的升 级,据资料统计得知 ,对 网络、硬件 、操作系统 、数据库参数进行
优化 所获得的性能提升 ,全部 加起 来大概只提高 40%左右 ,而 60%的
提升是来 自对应用程 序的优化 ;因此许 多优 化专家 认为,对应用程
序 的优 化可 以得到 80%的系统性能 的提升 。应用程序 的优化通 常可
分为两个方 面:源 代码和 SQI 语 句 ,源代 码 的优 化 由于涉 及到对程
序逻 辑的改变,且在 时间、成本和风险上代价很高 ,而对数据库系统
性能的提升收效又有限;所 以多采取对 SQL语句 的优化 。
一
、 为什 么要优化 SOL语句
在数据 库系统 中查询是数据库 中最基本 、最常 用、最复杂 的操
作,也 是所有数据库操作 中所 占据 比重最大的操作 。当数据库 系统
积累到 一定程度 ,若查询 时采用单条顺 序扫描 ,那么扫描 一遍所 有
的记录 可能就得 花上几十分钟 、甚至 几小时 ,这 样的话 系统就 失去
了即实的使用价值 。而采取什么样 的查询策略 ,能使查询的时间 降
为 几分 钟 、几秒 钟 ,如何 更精确 、简便 的得 到查询 结 果 ,就 是 要对
SQL语句 的优 化 问题 。
查询优 化是 力图找 出与给 定的表达式 等价 ,但 执行效 率更 高
的一个表达 式,一个 查询往往会 有许 多实现 方法 ,关键是如何 找 出
一
个 与之等价 的且操作 时间又少 的表 达式 ,查询优 化关注 的 问题
是 怎样 省时 、省空间 以及效率高 。优化 的核 心问题是尽可能减少查
询 中各 农的参与加工 的数据 量,从而达 到优化 时间和空 间的 目的。
第 一 、由于 SQL语句 是对数据库 进行操作 的惟一途 径 ,对数据
库 系统 的性 能起着决 定性的作用 。
第二、由于 SQL语句消耗 了 70%至 90%的数据库资源 。
第三 、由于 SOL语 句独立于程序 设计逻 辑 ,对 SQL语 句进行 优
化不会影响程序 逻辑 。
第 四、由于 SQL语句有着 不同的写法,但在性能上差异非常大。
第五 、由于 SQL语句非 常容 易学 ,但 却很 难精通 。
二、如 何进行 SQL语 句优 化
优化 SQL语 句的方法是通过重 写进行优化 的,DBA或资深 程序
员通 常通过对 SOL语句 执行计划 的分 析,依 靠经 验 ,尝试重 写 SOL
语句 ,然后对 结果和性 能进行 比较 ,以试 图找到性 能较佳 的 SQL语
句 。
1.在查 询 Select语句 中用 Where子 句限制返 回 的行 数,避免
表扫 描,若返 回不 必要 的数据 ,既浪 费了服 务器 的 I/O资源 ,又 加
重 了网络 的负担降低性能 。
2.在查询 时不要返回不需要 的行、列 。
3.在 IN后面值 的列表 中,将 出现最 频繁 的值 放在 最前 面 ,出
现得最少 的放在最后 面,减少判 断的次数 。
静 220
4.select中 Where子句选择 所有合 适的行 ,Group By用 来分
组 统计 行,Having子句用来剔 除多余的分组 。如果 Group BY的 目
的不包括 计算 ,只 是分组 ,那 么用 Distinct更快 ,Havin子句 仅在
聚集 Group By子 句收集行之 后才施加 限制 ,这 样导致 全表扫 描后
再选择 ,若可 以使 用 Where子句来代 替 Having,则在扫描表 的同 时
就 进行 了选择 ,其查询 效率大大提 高 了。但 是当 Having子句 用于
聚 集函数时不能 由 WHERE代替 时则必须使用 Having。
三、边做边 学提升 SQL语句 的开发水平
1.WHERE后面 的条件顺序影响
WHERE子句后面 的条件顺 序对 大数据量 表 的查询会 产生 直接
的影响 。如 :
Select 水 from zl
— yhjbqk where dy~dj= ’1KV以下 ’and
xh
—
bz=l
Select ,Ic from zl
— yhjbqk where xh—
bz=l and dy
—
dj =
’1KV以下 ’
以上两个 SQL中 dy— dj(电压 等级)及 Xn bz(销 户标 志)两 个
字段都 没进行索 引,所 以执 行的时候都 是全 表扫 描 ,第 一条 SOL的
dy
— dj=’1KV以下 ’条件在记 录集 内比率为 99%,而 xh bz=l的
比率只 为 0.5%,在进 行第一条 SQL的时候 99%条记录 都进行 dy dj
及 xh bz的比较 ,而 在进行第二条 SQL的时候 0.5%条记录 都进行
dy
— dj及 Xn— bz的比较 ,以此 可以得 出第二条 SQL的 CPU占用率 明
显 比第 一条低 。
2.查询 表顺序的影响
在 FROM后面 的表中的 列表 顺序会 对 sQL执 行性能影 响 ,在没
有索引及没有 对表进行 统计分析 的情 况下,就会按表 出现 的顺 序
进 行链接 ,由此可见表 的顺 序不对时会产 生十分耗服 务器 资源 的
数据交叉 。
四、写出专家级的 SQL语句
查询优化是关键 的问题 ,其 重点在于 如何提高 sQL的执行 效
率 ,所 以选择 什么样的查询语句 是关键 。在数据库 的开发和维护 过
程 中,查询 的优化 可 以提高系 统的性能 ,对于数据 量大 的数据库 系
统尤为重要 。
写 SQL语句 时更主要 的是理解优 化的 目的,所有 的数据库 优
化就 是一个 原则 ,尽 量少 的逻 辑读 ,尽 量少 的 占内存 ,所 以那些 优
化 的细节 并不是主 要的 ,而是如何从运行 的系统迅速 定位 问题 ,如
果从 SOL设计初期避免 问题 才是关键 ,它就 能帮用户 找到最 佳的
写法 。
参考文献 :
[1]张孔倚.关于人 工智能技 术在情报检 索中的应用.山西大 学
学报,2007(3)
[2]李 明,沈 红君 .情报检 索智 能化.情报理论 与实践 ,2005(6)
[3]涂序彦.人工智 能及 其应用.北京 :清华大 学出版 社,2006
[4]徐秀勤 ,Oracle数据库 中 语句优 化 SQL(南 京信 息职业技
术学院软件 学院 江苏 南京 210046,),文章编 号 1009.3044
(2010)24-6679—03:
[5]薛永宁,Oracle数据库 SQL语句优化初探 ,文章编号.1674—
6708(2010)31-0213—02
作者简介 :
王英杰 ,(1965.1.),女,学历本科,副教授 ,研究方 向为软件开发。
梁小强,(1974.4.),男 ,学历本科 ,助教 ,研 究方 向为软 件开发 。