没有合适的资源?快使用搜索试试~ 我知道了~
sql语句执行效率,有很多的总结哦!有很多关于怎么去提高效率的问题哦
资源推荐
资源详情
资源评论
摘抄:http://ruby305.blog.51cto.com/3979000/1043329
SQL 执行效率
标签:sql 效率
1.关于 SQL 查询效率,100w 数据,查询只要 1 秒,与您分享:
机器情况
p4:2.4
内存:1G
os:windows2003
数据库:mssqlserver2000
目的:查询性能测试,比较两种查询的性能
SQL 查询效率 stepbystep
--setp1.
--建表
createtablet_userinfo
(
useridintidentity(1,1)primarykeynonclustered,
nickvarchar(50)notnulldefault'',
classidintnotnulldefault0,
writetimedatetimenotnulldefaultgetdate()
)
go
--建索引
createclusteredindexix_userinfo_classidont_userinfo(classid)
go
--step2.
declare@iint
declare@kint
declare@nickvarchar(10)
set@i=1
while@i<1000000
begin
set@k=@i%10
set@nick=convert(varchar,@i)
insertintot_userinfo(nick,classid,writetime)values(@nick,@k,getdat
e())
set@i=@i+1
end
--耗时 08:27,需要耐心等待
--step3.
selecttop20userid,nick,classid,writetimefromt_userinfo
whereuseridnotin
(
selecttop900000useridfromt_userinfoorderbyuseridasc
)
--耗时 8秒 ,够长的
--step4.
selecta.userid,b.nick,b.classid,b.writetimefrom
(
selecttop20a.useridfrom
(
selecttop900020useridfromt_userinfoorderbyuseridasc
)aorderbya.useriddesc
)ainnerjoint_userinfobona.userid=b.userid
orderbya.useridasc
--耗时 1秒,太快了吧,不可以思议
--step5where查询
selecttop20userid,nick,classid,writetimefromt_userinfo
whereclassid=1anduseridnotin
(
selecttop90000useridfromt_userinfo
whereclassid=1
orderbyuseridasc
)
--耗时 2秒
--step6where查询
selecta.userid,b.nick,b.classid,b.writetimefrom
(
selecttop20a.useridfrom
(
selecttop90000useridfromt_userinfo
whereclassid=1
orderbyuseridasc
)aorderbya.useriddesc
)ainnerjoint_userinfobona.userid=b.userid
orderbya.useridasc
--查询分析器显示不到 1秒.
查询效率分析:
子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。在这
种情况下可以考虑用联接查询来取代。
如果要用子查询,那就用 EXISTS 替代 IN、用 NOTEXISTS 替代 NOTIN。因
为 EXISTS 引入的子查询只是测试是否存在符合子查询中指定条件的行,效率
较高。无论在哪种情况下,NOTIN 都是最低效的。因为它对子查询中的表执行
了一个全表遍历。
建立合理的索引,避免扫描多余数据,避免表扫描!
几百万条数据,照样几十毫秒完成查询.
2.
SQL 提高查询效率
2008-05-1221:20
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where及 orderby
涉及的列上建立索引。
2.应尽量避免在 where子句中对字段进行 null值判断,否则将导致引擎放弃
使用索引而进行全表扫描,如:
selectidfromtwherenumisnull
可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:
selectidfromtwherenum=0
3.应尽量避免在 where子句中使用!=或<>操作符,否则将引擎放弃使用索引
而进行全表扫描。
4.应尽量避免在 where子句中使用 or来连接条件,否则将导致引擎放弃使用
索引而进行全表扫描,如:
selectidfromtwherenum=10ornum=20
可以这样查询:
selectidfromtwherenum=10
unionall
selectidfromtwherenum=20
5.in和 notin也要慎用,否则会导致全表扫描,如:
selectidfromtwherenumin(1,2,3)
对于连续的数值,能用 between就不要用 in了:
selectidfromtwherenumbetween1and3
6.下面的查询也将导致全表扫描:
selectidfromtwherenamelike'%abc%'
若要提高效率,可以考虑全文检索。
7.如果在 where子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行
时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它 必
须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知
的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
selectidfromtwherenum=@num
可以改为强制查询使用索引:
selectidfromtwith(index(索引名))wherenum=@num
8.应尽量避免在 where子句中对字段进行表达式操作,这将导致引擎放弃使用
索引而进行全表扫描。如:
selectidfromtwherenum/2=100
应改为:
selectidfromtwherenum=100*2
剩余18页未读,继续阅读
资源评论
zhaofenglin
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功