在写一个存储过程中,遇到了一个问题,自己写的SQL总是运行效率太低,于是上网搜索,学到了一个新招,都怪自己平时不爱学习啊,不过这个语法真的很厉害。
需求:取一个表中每个id的最新三条数据(按照更新时间倒序取)
SELECT * FROM #T AS T WHERE 3>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)
或是
SELECT * FROM #T AS T
WHERE ID IN(SELECT TOP 3 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)
这是我的写法,一共运行了。。。反正半分钟后我就点了取消
网上有两个写法
1)使用APPLY
SELECT DISTINCT b.*
FROM #T AS a
CROSS APPLY
(
SELECT TOP(3) *
FROM #T
WHERE a.GID=GID
ORDER BY Date DESC
) AS b
2)使用ROW_NUMBER()进行排位分组
SELECT ID,GID,Author,Title,Date
SELECT ID,GID,Author,Title,Date
FROM
(
SELECT rid=ROW_NUMBER()
OVER(PARTITION BY GID
ORDER BY Date DESC),
*
FROM #T
) AS T
WHERE rid<=3
表格共有7万多行数据,字段大概20个,第1)种方法运行9秒,第2)种方法运行3秒,网上牛人果然很多,受教了。
修改:今天想到正式服务器貌似数据量更大,于是拿到正式机上去跑跑,居然运行了15分钟(中间哥还仔细研究了一下goagent),于是继续找优化,发现是需求订的有漏洞,于是加上限制范围后再运行,不到2秒就结束了,over。
修改:今天想到正式服务器貌似数据量更大,于是拿到正式机上去跑跑,居然运行了15分钟(中间哥还仔细研究了一下goagent),于是继续找优化,发现是需求订的有漏洞,于是加上限制范围后再运行,不到2秒就结束了,over。
没有评论:
发表评论