一句sql语句多次占用高cpu,而且还多次占用

huangwenquan123 2010-10-16 02:51:34
用事件查看器查看了执行效率
发现这句话占用cpu特别多!有时飙到500多!
准备放到视图里面去,可是视图里又不能传参数。
大家对这句sql有什么优化的地方呢?
大家帮帮忙



select top 4 cu.UserBBName,cu.UserPhoto,cu.UserVotes,(select e.us from (select
a.userid,count(b.userid)+1 us from cm_users_tbl a left join cm_users_tbl b on
a.uservotes<b.uservotes group by a.userid) e inner join cm_users_tbl d on
e.userid=d.userid where d.userid=cu.UserID) as rank,gender=case cmu.gender when 1
then '男' else '女' end, Convert(varchar(20),datediff(Month,Birthday,getdate())/12)
+'岁'+ Convert(varchar(20),datediff(Month,Birthday,getdate())%12) + '个月' as
age,cv.UserId,convert(varchar(5),VisitAddtime,110)+' '+convert(varchar
(5),VisitAddtime,114) as VisitAddtime,VisitUserName,VisitUserId,VisitPhoto from
CM_Visitors_Tbl cv inner join cm_userinfo_tbl cmu on cmu.userid=cv.VisitUserId
inner join cm_users_tbl cu on cu.userid=cv.VisitUserId where cv.UserID=1972 order
by VisitAddtime desc

...全文
198 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
谢谢各位哥!
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 huangwenquan123 的回复:]
顺便问个问题
有两个表一个是SH_Brand_tbl一个是SH_Gallery_Id
一个品牌可以发多个产品
然后我写了

SQL code

SELECT * FROM SH_Gallery_Tbl g inner join SH_Brand_Tbl b ON g.Brand_Id=b.Brand_Id
WHERE g.Gall_Id =
(SELECT M……
[/Quote]可以了!少加了条件sorry

可以顺便在问下大家不!
要想知道写什么语句效率高该看什么sql的书?
可以推荐下不!
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
顺便问个问题
有两个表一个是SH_Brand_tbl一个是SH_Gallery_Id
一个品牌可以发多个产品
然后我写了

SELECT * FROM SH_Gallery_Tbl g inner join SH_Brand_Tbl b ON g.Brand_Id=b.Brand_Id
WHERE g.Gall_Id =
(SELECT MAX(Gall_Id)
FROM SH_Gallery_Tbl gg
WHERE gg.Brand_Id = g.Brand_Id) and cate_id=2

为什么不对呢?
出来的行和我算的行不对!
claro 2010-10-16
  • 打赏
  • 举报
回复
的确。

不过之前有位台湾的同胞写过比这还扯的脚本,相比之下还罢了。
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 duanzhi1984 的回复:]
小小的改动都提高20倍,看来确实是神人一个
[/Quote]是那句sql写的太不好了!= =!
claro 2010-10-16
  • 打赏
  • 举报
回复
!!!
duanzhi1984 2010-10-16
  • 打赏
  • 举报
回复
小小的改动都提高20倍,看来确实是神人一个
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 claro 的回复:]
而这里的CPU时间单位是毫秒。
[/Quote]恩!谢谢
今天看下了下服务器的cpu
每次都是90%在波动= =!好高!
claro 2010-10-16
  • 打赏
  • 举报
回复
而这里的CPU时间单位是毫秒
claro 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangwenquan123 的回复:]
这个reads是什么意思呢?
是多少个人查看吗?
[/Quote]-_-!

不是。

是指该事件读取逻辑磁盘的次数。
SQLCenter 2010-10-16
  • 打赏
  • 举报
回复
神人,就是改了rank那里
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sqlcenter 的回复:]
2000的话,要优化可以考虑这种折中方案:

select e.us from (select a.userid,count(b.userid)+1 us from cm_users_tbl a left join cm_users_tbl b on a.uservotes<b.uservotes group by a.userid)e
inner join cm_users_tbl d o……
[/Quote]谢谢你的建议!都是神人也!
看一下sql语句也可以看出在干什么
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql77 的回复:]
SQL code
[code=SQL]select top 4 cu.UserBBName,cu.UserPhoto,cu.UserVotes,
(
select
count(b.userid)+1 us
from
cm_users_tbl b WHERE CU.uservotes<b.us……
[/Quote]
7哥真乃神人也!
运行速度快了20倍左右
请问下改动了哪里呢?
以后写sql语句有什么要注意的地方呢?
SQLCenter 2010-10-16
  • 打赏
  • 举报
回复
2000的话,要优化可以考虑这种折中方案:

select e.us from (select a.userid,count(b.userid)+1 us from cm_users_tbl a left join cm_users_tbl b on a.uservotes<b.uservotes group by a.userid)e
inner join cm_users_tbl d on e.userid=d.userid where d.userid=cu.UserID

这句,生成一个静态的排名表,定期刷新。
如果要求实时排名敏感那很难搞了,你看CSDN的排名都是定时刷新的,不会实时给你显示排名。
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复

这个reads是什么意思呢?
是多少个人查看吗?
huangwenquan123 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sqlcenter 的回复:]
这也太多表了

as rank,
2005这里可以用排名函数
[/Quote]用的还是2000额!
SQL77 2010-10-16
  • 打赏
  • 举报
回复
[code=SQL]select top 4 cu.UserBBName,cu.UserPhoto,cu.UserVotes,
(
select
count(b.userid)+1 us
from
cm_users_tbl b WHERE CU.uservotes<b.uservotes ) as rank,

gender=case cmu.gender when 1 then '男' else '女' end,
Convert(varchar(20),datediff(Month,Birthday,getdate())/12) +'岁'+ Convert(varchar(20),datediff(Month,Birthday,getdate())%12) + '个月' as age,
cv.UserId,
convert(varchar(5),VisitAddtime,110)+' '+convert(varchar(5),VisitAddtime,114) as VisitAddtime,
VisitUserName,
VisitUserId,
VisitPhoto

from
CM_Visitors_Tbl cv
inner join cm_userinfo_tbl cmu on cmu.userid=cv.VisitUserId
inner join cm_users_tbl cu on cu.userid=cv.VisitUserId
where cv.UserID=1972
order by VisitAddtime desc


不知道有没有理解错,你那个子查询太晕了[/code]
SQLCenter 2010-10-16
  • 打赏
  • 举报
回复
这也太多表了

as rank,
2005这里可以用排名函数

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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