Foxtable(狐表)用户栏目专家坐堂 → ROW_NUMBER排序后作为子查询再分页出现超时


  共有4064人关注过本帖树形打印复制链接

主题:ROW_NUMBER排序后作为子查询再分页出现超时

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
ROW_NUMBER排序后作为子查询再分页出现超时  发帖心情 Post By:2020/12/15 11:50:00 [只看该作者]

如下面的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条记录,但在外面加上分页查询后却出现查询超时,一直显示不出来,
因为这是用在项目上通用的一种查询结构,多数查询都没问题,但有个别象上面看似很简单的查询却有问题,会是什么原因呢?

谢谢!

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:112396 积分:572248 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By: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;

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



 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:112396 积分:572248 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/15 14:51:00 [只看该作者]

那要提供数据库备份详细测试过才知道了

 回到顶部