以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  ROW_NUMBER排序后作为子查询再分页出现超时  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=159134)

--  作者:happyft
--  发布时间:2020/12/15 11:50:00
--  ROW_NUMBER排序后作为子查询再分页出现超时
如下面的sql语句:
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY 生产单号 DESC ) AS RowNum ,
                    *
          FROM      uv_sc115
          WHERE     下单日期 >= \'2020-01-01\'
                    AND ( 生产单号 LIKE \'%55外%\'
                          OR CONVERT(NVARCHAR, 下单日期, 120) LIKE \'%55外%\'
                          OR 产品编码 LIKE \'%55外%\'
                          OR 品名 LIKE \'%55外%\'
                          OR 规格 LIKE \'%55外%\'
                        )
        ) AS tb
WHERE   RowNum >= 1
        AND RowNum <= 1000;

红色的语句执行只要1秒,查出有32条记录,但在外面加上分页查询后却出现查询超时,一直显示不出来,
因为这是用在项目上通用的一种查询结构,多数查询都没问题,但有个别象上面看似很简单的查询却有问题,会是什么原因呢?

谢谢!

--  作者:有点蓝
--  发布时间:2020/12/15 12:11:00
--  
加索引,少用like:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=158943&replyID=&skin=1

另外多人使用的时候,刚好有其他人在做费时的数据库操作的时候,可能会锁表,这时在查询这个表数据的时候,肯定要等其他人完成。

试试加上WITH(NOLOCK)

WHERE   RowNum >= 1
        AND RowNum <= 1000 WITH(NOLOCK);

--  作者:HappyFt
--  发布时间:2020/12/15 14:42:00
--  
没有锁表的情况,如果先将了子查询保存在一个临时表中,如下
IF OBJECT_ID(\'tempdb..#temp1\') IS NOT NULL
    DROP TABLE #temp1;      
SELECT  a.*
INTO    #temp1
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY 生产单号 DESC ) AS RowNum ,
                    *
          FROM      uv_sc115
          WHERE     下单日期 >= \'2020-01-01\'
                    AND ( 生产单号 LIKE \'%55外%\'
                          OR CONVERT(NVARCHAR, 下单日期, 120) LIKE \'%55外%\'
                          OR 产品编码 LIKE \'%55外%\'
                          OR 品名 LIKE \'%55外%\'
                          OR 规格 LIKE \'%55外%\'
                        )
        ) a;
SELECT  *
FROM    #temp1
WHERE   RowNum >= 1
        AND RowNum <= 1000;

这样速度就很快了,但是这样只能改用储存过程 ,原来的整个结构就改掉了,不知道为何原来那个查询会慢



--  作者:有点蓝
--  发布时间:2020/12/15 14:51:00
--  
那要提供数据库备份详细测试过才知道了