改写sql优化性能

随风201333 2015-02-04 02:09:42
1. select … FROM a, c
WHERE a.userid = c.id
and a.winRatio >= 0
order by case when leaderboardmarkid=1200000081 then 0 else 1 end, a.roiinperiod desc 如何优化这部分: case when leaderboardmarkid=1200000081 then 0 else 1 end

加上他,性能差很多。。。

2. SELECT TOP (42)
[Element1].[id] AS [id],
[Element1].[userId] AS [userId],
[Element1].[originatorUserId] AS [originatorUserId]
FROM (SELECT [Extent1].[id] AS [id], [Extent1].[createdAtUtc] AS [createdAtUtc]
FROM [dbo].[Comment] AS [Extent1]
WHERE (([Extent1].[securityId] IN (7, 144, 185, 455, 566, 574, 1095, 1361, 1417, 1464, 1483, 1640, 2070, 2629, 4691, 4754, 4836, 4838, 5615, 6679, 8686, 9148, 9161, 9240, 9260, 9272, 9288, 9311, 9393, 9456, 9481, 9503, 9515, 9539, 9616, 9649, 9656, 10130, 10361, 10370, 10375, 10376, 10398, 10437, 10464, 10477, 11690, 12256, 12340, 12375, 12772, 13002, 13483, 13536, 16548, 17083, 17361, 17396, 19489, 20801, 21350, 23640, 23708, 23744, 24121, 24398, 25076, 27888, 29451, 30939, 32375, 32391, 32463, 32689, 32696, 32840, 35026, 35208, 35602, 35797, 36007, 36071, 36073, 36396, 36461, 36493, 36575, 37163, 37175, 37302, 44209, 44655, 44801, 45675, 47229, 47431, 48130, 48620, 51405, 51763, 53127, 57103, 58153, 58454, 59582, 60109, 81354, 84501, 88983, 92273, 92299, 94714, 97359, 97456, 123118, 123326, 140279, 140733, 143787, 152011)) OR (([Extent1].[userId] IS NOT NULL) AND ([Extent1].[userId] IN (321235, 562001, 562005, 562018)))) AND ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[TimeLineItem] AS [Extent2]
WHERE ([Extent1].[id] = [Extent2].[commentId]) AND ([Extent2].[originatorUserId] = [Extent1].[userId]) AND ([Extent2].[originatorDeletedAtUtc] IS NULL)
)) ) AS [Filter2]
OUTER APPLY (SELECT TOP (1)
[Extent3].[id] AS [id]

FROM [dbo].[TimeLineItem] AS [Extent3]
WHERE ([Extent3].[commentId] = [Filter2].[id]) AND ([Extent3].[originatorUserId] = [Extent3].[userId]) ) AS [Element1]
ORDER BY [Filter2].[createdAtUtc] DESC
其中comment 表要scan 两次,如何修改? 另外,此处out apply 如何能转换成 join? 此处没有函数,为啥会用apply
...全文
438 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
随风201333 2015-02-10
  • 打赏
  • 举报
回复
uoupupupup
随风201333 2015-02-09
  • 打赏
  • 举报
回复
试了试,还是不太会写。。。 结果变了, 我写的: set statistics time on declare @userId int = 5585568 ,@begin int,@end int SELECT top 4 abc FROM a join [user] c on a.userid = c.id where leaderboardmarkid=1200000081 --order by leaderboardmarkid, roiinperiod desc union SELECT ab FROM a join [user] c on a.userid = c.id where leaderboardmarkid <> 1200000081 order by a.roiinperiod desc, leaderboardmarkid
随风201333 2015-02-04
  • 打赏
  • 举报
回复
多谢多谢, 我明天试一下!格式还行,您的解释通俗易懂!
专注or全面 2015-02-04
  • 打赏
  • 举报
回复
次奥,格式太乱了,好久没有这么耐心回答问题了,csdn估计离关门不远了,改尼玛的版啊,改的不是404就是500
专注or全面 2015-02-04
  • 打赏
  • 举报
回复
其中comment 表要scan 两次,如何修改? 另外,此处out apply 如何能转换成 join? 此处没有函数,为啥会用apply comment 表要scan 两次 一次是那些查询条件,一次是EXISTS (SELECT 子查询,如果要优化的话,尝试对子查询中的表采用join的方式,有可能会好一点 另外,此处out apply 如何能转换成 join? 你要弄清楚out apply 是干啥的,out apply 中的内容是依赖于前面的结果集的, 逻辑是这样的,对前面产生的结果集做遍历,对于每一行的关联条件字段,分别应用到out apply 括号的查询中, 生成一个结果集,跟外层的数据做连接,但是你里面是 TOP (1) ,可以转换成左联接, 如果是 TOP (2),或者 TOP (N) N>1,则不能转换成左联接 啰啰嗦嗦说了这么多估计也没说清楚,说个实际例子吧 用户表 customer 订单表order 查询每个用户信息以及用户的最新的两个订单信息(没有订单的只返回用户信息),先想想怎么实现 此时就需要用到out apply(当然也不是说只有这一种方式) select * from customer c out apply (select top(2) * from order o where c.xustomerid=o.customerid ) 执行过程的伪代码就是 for(int i=0;i<customer.length;i++) { select top(2) * from order where customerid=customer[i].customerid { 遍历上面查询的这个结果集,输出客户信息+及其最早的两个订单信息 } }
卖水果的net 版主 2015-02-04
  • 打赏
  • 举报
回复
加上他,性能差很多。。。 这个,建议你多写一层 select * from (select from ...) order by case when .... then 0 else 1 end
专注or全面 2015-02-04
  • 打赏
  • 举报
回复
如何优化这部分: case when leaderboardmarkid=1200000081 then 0 else 1 end 这个建议用union all 将 leaderboardmarkid!=1200000081 和 leaderboardmarkid=1200000081 (其他查询条件加上) 查询出来的两部分连接起来,避免显式排序操作

34,588

社区成员

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

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