这句SQL存在性能问题,如何优化?

发布于 2022-09-05 05:30:06 字数 2187 浏览 13 评论 0

以下这句SQL看起来不是很复杂,但是性能非常差,经常需要花费好几秒,请教怎么优化它?在一个大表上反复查询,发现时间耗在count(0) over ( ) as totalcount上面

select  a.inquiryid ,
         a.inquiryno ,
         a.inquirystatus ,
         a.requireid ,
         a.datachange_createtime ,
         a.datachange_lasttime ,
         a.creator ,
         a.ipaddress ,
         a.remark ,
         a.rejectreasonid ,
         a.inquirydetailid ,
         a.isdelete ,
         a.rejectreason ,
         a.departure ,
         a.destination ,
         a.platformcreator ,
         a.tourid ,
         a.nextcontacttime ,
         a.contactstatus ,    
         a.contactcreatetime as lastcontact_createtime,
         count(0) over ( ) as totalcount
    from prd_inquiry a ( nolock )        
        join  prd_inquirysupply c ( nolock ) on c.inquiryid = a.inquiryid 
        where   1 = 1  and c.inquirysupplystatus = @requirestatus 
        order by a.inquiryid desc  offset  ( @pageindex - 1 ) * @pagesize rows fetch next @pagesize rows only
        
            exec sp_executesql n'/*100000701*/
 select  a.inquiryid ,
                a.inquiryno ,
                a.inquirystatus ,
                a.requireid ,
                a.datachange_createtime ,
                a.datachange_lasttime ,
                a.creator ,
                a.ipaddress ,
                a.remark ,
                a.rejectreasonid ,
                a.inquirydetailid ,
                a.isdelete ,
                a.rejectreason ,
                a.departure ,
                a.destination ,
                a.platformcreator ,
                a.tourid ,
                a.nextcontacttime ,
                a.contactstatus ,    
                a.contactcreatetime as lastcontact_createtime,
                count(0) over ( ) as totalcount
        from    prd_inquiry a ( nolock )        
         join  prd_inquirysupply c ( nolock ) on c.inquiryid = a.inquiryid 
        where   1 = 1  and c.inquirysupplystatus = @requirestatus 
        order by a.inquiryid desc  offset  ( @pageindex - 1 ) * @pagesize rows fetch next @pagesize rows only ',n'@pageindex int,@pagesize int,@requirestatus int',@pageindex=1,@pagesize=50,@requirestatus=10

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

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

发布评论

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

评论(1

下壹個目標 2022-09-12 05:30:06

这个sql的过滤条件比较少,inquirysupplystatus过滤左右不明显。

如果inquiryid 是自增类型的数字,建议在查询中增加最大inquiryid 字段,并从页面传入到后续的sql语句中,这样就可以通过索引快速查询一个pagesize包含的记录,如:

select *, max(inquiryid) over () as max_inquiryid
from t
where inquiryid > @max_inquiryid 
order by a.inquiryid desc  offset 100 rows fetch next rows only
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文