以文本方式查看主题 - 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 -- 那要提供数据库备份详细测试过才知道了 |