求各位大侠帮忙解决下一个瓶颈

tiandiyuzhou1 2012-04-07 03:06:35
为什么这个简单的多表连接耗时14秒了?而且查出来的数据才5000多条,不知道问题出在哪里
CM_Users_Tbl 主键UserID
CM_UserInfo_Tbl 外键UserID---对外键UserID加了索引

select cu.flowers,
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,
cu.UserID,
cu.UserBBName,
cu.UserPhoto,
cu.UserVotes,
gender=case cmi.gender when 1 then '男' else '女' end,
Convert(varchar(20),datediff(Month,Birthday,getdate())/12) +'岁'+ Convert(varchar(20),datediff(Month,Birthday,getdate())%12) + '个月' as age
from CM_Users_Tbl cu inner join CM_UserInfo_Tbl cmi on cmi.userid=cu.userid
order by cu.UserVotes desc


然后我把那两列的计算项去掉,换成在C#中处理,也是要14秒。

select cu.flowers,
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,
cu.UserID,
cu.UserBBName,
cu.UserPhoto,
cu.UserVotes,
cmi.gender
Birthday
from CM_Users_Tbl cu inner join CM_UserInfo_Tbl cmi on cmi.userid=cu.userid
order by cu.UserVotes desc


不知道瓶颈在哪里,希望各位大侠帮忙下。
...全文
153 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiandiyuzhou1 2012-04-18
  • 打赏
  • 举报
回复
这个是执行计划,看不懂这个,不知道哪里浪费了性能
tiandiyuzhou1 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
cu.UserPhoto,
是否图片?

去掉这个字段试下。
[/Quote]这个是个varchar类型,存的是路径不是image。
昵称被占用了 2012-04-10
  • 打赏
  • 举报
回复
cu.UserPhoto,
是否图片?

去掉这个字段试下。
Leon_He2014 2012-04-10
  • 打赏
  • 举报
回复
1. CM_UserInfo_Tbl CM_Users_Tbl 两个表分别有多大数据量?
2.(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank
这个如果只是用来做排序,用row_number() 来实现比较合适
daiyueqiang2045 2012-04-10
  • 打赏
  • 举报
回复
你这索引假脱机 耗费了45%。
可以试一试 清理缓存,再试一试。
yuanmeixiang 2012-04-09
  • 打赏
  • 举报
回复
子查询(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,
是慢的主要原因
leijunyuncyuyan 2012-04-09
  • 打赏
  • 举报
回复
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,
count(b.userid)+1 us 这个中间怎么有个us,啥意思?不懂
tiandiyuzhou1 2012-04-07
  • 打赏
  • 举报
回复
会不会和当前在用数据库的人有关呢?
因为一天差不多有300左右的并发,因为是投票型的.
而且一天早上,下午,晚上访问数都蛮高的.
日pv差不多20000
tiandiyuzhou1 2012-04-07
  • 打赏
  • 举报
回复
我把(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,这句去掉后还是一样的时间.
下面运行后的执行计划,看不懂,希望大家帮忙解决下.
小天 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,

这快应该是慢的原因,会做很多全表扫描
你ctrl + L 查看一下执行计划就知道了
[/Quote]
表示支持
tiandiyuzhou1 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
SQL code
建议 在uservotes 和 userid 字段上创建索引。
或者 创建一个包含索引 比如
create index idx_name on CM_Users_Tbl (uservotes desc,userid desc)
include (flowers,UserBBName,UserPhoto)
[/Quote]恩,CM_users_Tbl中的UserID是主键,做了聚集索引
然后CM_UsersInfo_Tbl中的外键UserID做了非聚集索引.
tiandiyuzhou1 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,

这快应该是慢的原因,会做很多全表扫描
你ctrl + L 查看一下执行计划就知道了
[/Quote]是不是该对uservotes也做个索引?可是平时也很少用到这个做条件.
Felixzhaowenzhong 2012-04-07
  • 打赏
  • 举报
回复
建议 在uservotes 和 userid 字段上创建索引。
或者 创建一个包含索引 比如
create index idx_name on CM_Users_Tbl (uservotes desc,userid desc)
include (flowers,UserBBName,UserPhoto)
wyx100 2012-04-07
  • 打赏
  • 举报
回复
select cu.flowers,
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,
cu.UserID,
cu.UserBBName,
cu.UserPhoto,
cu.UserVotes,
gender=case cmi.gender when 1 then '男' else '女' end,
Convert(varchar(20),datediff(Month,Birthday,getdate())/12) +'岁'+ Convert(varchar(20),datediff(Month,Birthday,getdate())%12) + '个月' as age
from CM_Users_Tbl cu inner join CM_UserInfo_Tbl cmi on cmi.userid=cu.userid
order by cu.UserVotes desc



koumingjie 2012-04-07
  • 打赏
  • 举报
回复
(select count(b.userid)+1 us from cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,

这快应该是慢的原因,会做很多全表扫描
你ctrl + L 查看一下执行计划就知道了
tiandiyuzhou1 2012-04-07
  • 打赏
  • 举报
回复
全部分数都在这了。

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧