求高手解答,怎么优化这条sql语句?现在查询速度很慢
WITH t AS (
SELECT *,
ROW_NUMBER() over(order by CommentDate Desc) AS ss
from (
SELECT
id, userid, date, CommentDate, mediaurl, mediatype,
content, locationdec, contenttype, messagetype,
location.Lat latitude, location.Long longitude
FROM Message
WHERE
location.STIntersects(geography::STPointFromText(
'POINT(' + @P1 + ' ' + @P2 + ')', 4326).STBuffer(@P3)
)=1 And ( contenttype in ( 1,2,8,9,7,6))
UNION ALL
SELECT
id, userid, date, CommentDate, mediaurl, mediatype,
content, locationdec, contenttype, messagetype,
location.Lat latitude, location.Long longitude
FROM Message
WHERE Contenttype =4
) A
) SELECT * FROM t WHERE ss BETWEEN 21 AND 40
当记录大于70万条之后很慢, 其中Contenttype=4
和geography
查询是必须, contenttype 1,2,8,9,7,6
是不确定的查询参数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
题主太放任SQL接管一切了。这么写好了完全甩手交给SQL服务器去做,程序对查询的中间过程就失去了很多介入和控制的机会,恐怕不是好事。
(看着就头痛……排了下版,估计会有错误请轻拍)
有两个地方可以优化
1、 在contenttype 字段上增加索引
2、 ROW_NUMBER() over语句换成两层rownum的方式,如:
关键是看执行计划中是否使用了COUNT STOPKEY,如
如果对排序没有严格要求,可以将排序语句去掉。