没有合适的资源?快使用搜索试试~ 我知道了~
sql语句性能提高.doc
需积分: 10 10 下载量 156 浏览量
2009-11-08
21:54:42
上传
评论
收藏 99KB DOC 举报
温馨提示
试读
20页
sql语句性能提高.doc sql语句性能提高.doc
资源推荐
资源详情
资源评论
语句性能提高
合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数
的数据库产品都采用 最先提出的 索引结构。索引的使用要恰到好处,其使用原
则如下:
在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由
优化器自动生成索引。
在频繁进行排序或分组(即进行 或 操作)的列上建立索引。
在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建
立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
如果待排序的列有多个,可以在这些列上建立复合索引()。
使用系统工具。如 数据库有一个 工具,可以在
疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得
读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用 工具检
查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引
可以提高查询速度。
在下面两条 语句中
!"#$#%&'(((("%)'(*
!"#$#%)'("%&'((((*
如果数据表中的数据 % 都)'(+则第一条 语句要比第二条 语句效
率高的多,因为第二条 语句的第一个条件耗费了大量的系统资源。
第一个原则:在 $ 子句中应把最具限制性的条件放在最前面。
, !"#$#"'-"'-"'-*
若有索引 "++,则 $ 子句中字段的顺序应和索引中字段顺序一致。
第二个原则:$ 子句中字段的顺序应和索引中字段顺序一致。
以下假设在 % 上有唯一索引 ,在 %, 上有非唯一索引 ,。
. %.+%/$%'00####快
!$%'00###慢,
因为后者在索引扫描后要多一步 1234 表访问。
/ %.+%/$%)'00快
%.+%/$%)00###慢
因为前者可以迅速定位索引。
5 %.+%/$%,0160##快
%.+%/$%,0610# 慢,
因为后者不使用索引。
7%.+%/$%,'0180不使用索引。
如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,严格禁
止使用函数!两万条记录以下没有限制。
9空值不在索引中存储,所以
%.+%/$%,:; 不使用索引。
<不等式如
%.+%/$%,='0>20不使用索引。
相似地,
%.+%/$%,00+0?0不使用索引。
@多列索引,只有当查询中索引首列被用于条件时,索引才能被使用。
(A,8 等函数,如
"%, 使 用 索 引 。 所 以 , 如 果 需 要 对 字 段 取
",, 等,应该加索引。
一次只使用一个聚集函数,如:
BC'%+B"C'"%####
不 如 : BC' % + B"C'
"%##
重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改该字段值时还要
修改索引,所以更新该字段的操作比没有索引更慢。
,索引值过大(如在一个 "/(的字段上建索引),会造成大量的 D2 开销(甚至会
超过表扫描的 D2 开销)。因此,尽量使用整数索引。 E" 可以计算表和索引的
开销。
.对于多列索引, 的顺序必须和索引的字段顺序一致。
/在 " 中,如果 的字段组成一个簇索引,那么无须做 。记录
的排列顺序是与簇索引一致的。
5多表联结(具体查询方案需要通过测试得到)
$ 子句中限定条件尽量使用相关联的字段,且尽量把相关联的字段放在前面。
select a.eld1,b.eld2 from a,b where a.eld3=b.eld3
F%. 上没有索引的情况下
对 " 作全表扫描,结果排序
对 作全表扫描,结果排序
结果合并。
对于很小的表或巨大的表比较合适。
,F%. 上有索引
按照表联结的次序, 为驱动表," 为被驱动表
对 作全表扫描
对 " 作索引范围扫描
如果匹配,通过 " 的 $ 访问
7避免一对多的 G。如:
F%.+F%/+,F%, +, $
F%,',F%,"F%,'HI(.,J",F%,'H"""J
不如:
"K"L""<(
K"'%,,$%,'H"""J#
F%.+F%/+K"$%,'H"""J
7子查询
用 D 代替 D 操作
比较:
"F% " $ "F%, F% $
F%,'((
"F% " $ $
"F%,'F%"F%,'((
%"$%%,
% " $ $
F%,'"F%
9主、外键主要用于数据约束," 中创建主键时会自动创建索引,外键与索引无
关,提高性能必须再建索引。
<" 类型的字段不建索引比 类型的字段不建索引更糟糕。建索引后性能只稍差一
点。
@ 使 用 ! 而 不 要 使 用 E" , 避 免 使 用
E"。
,(等号右边尽量不要使用字段名,如:
!$%'%.#
,避免使用 条件,因为 不使用索引。
,F避免使用 和 字句。
因为使用这两个子句会占用大量的临时空间"+如果一定要使用,可用视
图、人工生成临时表的方法来代替。
如果必须使用,先检查 、 的大小。
测试证明,特别要避免一个查询里既使用 G 又使用 ,速度会非常慢!
.F尽量少用子查询,特别是相关子查询。因为这样会导致效率下降。
一个列的标签同时在主查询和 $ 子句中的查询中出现,那么很可能当主查询中的
列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量
避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
/.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取
策略,一个嵌套 . 层的查询,如果每层都查询 ((( 行,那么这个查询就要查询 ( 亿行
数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号
姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学
号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的
$ 子句强迫优化器使用顺序存取。下面的查询将强迫对 表执行顺序操作:
MNMO> * P12 3QM1M E'(/ 84
E)((21E'((<
虽然在 E 和 E 上建有索引,但是在上面的语句中优化器还
是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改
为如下语句:
MNMO> * P12 3QM1M E'(/ 84
E)((
I828
MNMO>* P123QM1ME'((<
这样就能利用索引路径处理查询。
5.避免困难的正规表达式
>OQM 和 NRM 关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别
耗费时间。例如:MNMO>* P123QM1MSNRMB@<EEEC即使
在 S 字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改
为 MNMO>* P123QM1MS)B@<(((C,在执行查询时就会利用
索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。例如语句:MNMO>* P123QM1M
S:,,.;)B<(C,在 $ 子句中采用了非开始子串,因而这个语句也不会使用
索引。
7.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操
作,而且在其他方面还能简化优化器的工作。例如:
MNMO>F",LF"",……
剩余19页未读,继续阅读
资源评论
fengyuanfa
- 粉丝: 15
- 资源: 387
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功