标题: [推荐]让SQL运行得更快
hyj136
LU幼天使
Rank: 2



UID 1795
精华 1
积分 112
帖子 219
活跃指数 6
LU金币 2036 个
LU金条 0 个
阅读权限 20
注册 2003-11-6
 
发表于 2003-11-6 10:43  资料  个人空间  短消息  加为好友 
让SQL运行得更快
/******组合索引,前导列
.在place,date,amount上的组合索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000 (26秒)
select date,sum(amount) from record group by date
(27秒)
select count(*) from record where date >
'19990901' and place in ('BJ, 'SH')(< 1秒)

---- 分析:
---- 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。


/******最佳查询方案是将card作外层表,account作内层表,利用account上的索引,
例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:

select sum(a.amount) from account a,
card b where a.card_no = b.card_no(20秒)

---- 将SQL改为:
select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
Account_no=b.account_no(< 1秒)

----


/******任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

select * from record where
substring(card_no,1,4)='5378'(13秒)
select * from record where
amount/30< 1000(11秒)
select * from record where
convert(char(10),date,112)='19991201'(10秒)

---- 分析:
---- where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

select * from record where card_no like
'5378%'(< 1秒)
select * from record where amount
< 1000*30(< 1秒)
select * from record where date= '1999/12/01'
(< 1秒)"





我是一个乡巴佬 ,乡巴佬 。。。
顶部
瓜小南
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14


UID 128
精华 32
积分 1808
帖子 3485
活跃指数 10
LU金币 188 个
LU金条 0 个
阅读权限 200
注册 2003-9-26
 
发表于 2003-11-7 09:20  资料  个人空间  短消息  加为好友 
虽然是个老贴,还是加精鼓励一下 smile.gif





我们匆匆相识 匆匆言爱 匆匆相许一生,
爱情也许并没有那么真的让我们那么失望,
失望只是由于我们自己的放弃。

午夜梦回。
略为清醒的时刻,
总是会想起她。
相信, 她也会想起我。
顶部
永杰
技术专家
Rank: 14Rank: 14Rank: 14Rank: 14
小迷糊~~



UID 741
精华 12
积分 414
帖子 740
活跃指数 26
LU金币 187 个
LU金条 14334 个
阅读权限 200
注册 2003-10-18
来自 济南
 
发表于 2003-11-8 04:51  资料  个人空间  短消息  加为好友  添加 永杰 为MSN好友 通过MSN和 永杰 交谈
还是8错的说





生活让人无奈,但我永不放弃。。。
顶部
ErrOr
LU幼天使
Rank: 2



UID 2226
精华 0
积分 22
帖子 44
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2003-11-11
 
发表于 2003-11-12 18:40  资料  个人空间  短消息  加为好友 
我觉得建表的时候组合索引的顺序应该是:date ,place,amount会比较好一点。
date放在索引第一位比较合理。

顶部
leejun
LU新生
Rank: 1



UID 5144
精华 0
积分 1
帖子 2
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2003-12-9
 
发表于 2003-12-9 11:55  资料  个人空间  短消息  加为好友 
学习!

顶部
hyj136
LU幼天使
Rank: 2



UID 1795
精华 1
积分 112
帖子 219
活跃指数 6
LU金币 2036 个
LU金条 0 个
阅读权限 20
注册 2003-11-6
 
发表于 2003-12-9 16:39  资料  个人空间  短消息  加为好友 
QUOTE(shala @ 2003-11-07 09:20:05)
虽然是个老贴,还是加精鼓励一下 smile.gif

smile.gif
请问帮主,我的“精华帖数”怎么还是0啊?
我想既然加精 应该是 1 啦 :):)





我是一个乡巴佬 ,乡巴佬 。。。
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
 



当前时区 GMT+8, 现在时间是 2008-12-5 21:00
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.054130 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver