求高手解答,怎么优化这条sql语句?现在查询速度很慢

发布于 2022-08-28 11:04:35 字数 1000 浏览 8 评论 0

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=4geography查询是必须, contenttype 1,2,8,9,7,6 是不确定的查询参数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃不饱 2022-09-04 11:04:35

题主太放任SQL接管一切了。这么写好了完全甩手交给SQL服务器去做,程序对查询的中间过程就失去了很多介入和控制的机会,恐怕不是好事。

(看着就头痛……排了下版,估计会有错误请轻拍)

森林迷了鹿 2022-09-04 11:04:35

有两个地方可以优化
1、 在contenttype 字段上增加索引
2、 ROW_NUMBER() over语句换成两层rownum的方式,如:

select * from (
  select t_adam.*, rownum as row_num from t_adam
  where rownum <= 40
) where row_num > 20

关键是看执行计划中是否使用了COUNT STOPKEY,如

SELECT STATEMENT, GOAL = ALL_ROWS           2   40  1520
 VIEW   SYSTEM      2   40  1520
  COUNT STOPKEY                 
   TABLE ACCESS FULL    SYSTEM  T_ADAM  2   40  360

如果对排序没有严格要求,可以将排序语句去掉。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文