SQLServer分页查询效率太低

NET920 2016-08-01 01:57:38
SELECT * FROM (
SELECT ROW_NUMBER() OVER( order by CREATEDATE DESC ) AS rownum,
ID,NEWSTITLE,SHORTTITLE
FROM 表名
where ( NEWSTYPE=281 )
and [STATE]=0
) AS D WHERE rownum BETWEEN (1-1)*25+1 AND 1*25


各位牛人,上面的SQL是获取分页列表数据的,但查询效率实在太低了,最慢时,这条SQL查询要耗时10秒。。。而此表也不算大,才25W条数据,其中的 NEWSTYPE字段是非聚集索引。为什么查询这么慢呢,求帮助,谢谢亲。
...全文
1137 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
专注or全面 2016-08-02
  • 打赏
  • 举报
回复
你说的问题我遇到很多,不是稀罕事 第一是索引的问题,看你这个也是符合索引,不知道建的对不对,参考这个 http://www.cnblogs.com/wy123/p/5604400.html 第二个我看你是order by CREATEDATE DESC ,极有可能是走的聚集索引扫描 索引列的排序方式与查询结果的排序方式之间的关系也很重要,参考这个 http://www.cnblogs.com/wy123/p/5552719.html
吉普赛的歌 2016-08-01
  • 打赏
  • 举报
回复
SELECT *
FROM   (
           SELECT ROW_NUMBER() OVER(ORDER BY CREATEDATE DESC) AS rownum,
                  ID,
                  NEWSTITLE,
                  SHORTTITLE
           FROM   表名
           WHERE  (NEWSTYPE       = 281)
                  AND [STATE]     = 0
       ) AS D
WHERE  rownum BETWEEN (1 -1) * 25 + 1 AND 1 * 25

--增加索引1
CREATE INDEX IX_表名_NEWSTYPE_STATE on 表名 (NEWSTYPE, STATE) INCLUDE( ID, NEWSTITLE, SHORTTITLE )
--增加索引2
CREATE INDEX IX_表名_CREATEDATE on 表名 (CREATEDATE)

--建议:
--增加一个条件:AND CREATEDATE BETWEEN @d1 and @d2
--当然, 只限制 > 或者 < 也行
--一般来说, 用户关心的只是最近一段时间的数据(比如:3天之内,1周之内,你可以在界面上默认指定一个范围), 其它的数据意义不大
--而以时间字段为条件, 可以很快过滤掉大部分的数据, 效率很高。
吉普赛的歌 2016-08-01
  • 打赏
  • 举报
回复
SELECT *
FROM   (
           SELECT ROW_NUMBER() OVER(ORDER BY CREATEDATE DESC) AS rownum,
                  ID,
                  NEWSTITLE,
                  SHORTTITLE
           FROM   表名
           WHERE  (NEWSTYPE       = 281)
                  AND [STATE]     = 0
       ) AS D
WHERE  rownum BETWEEN (1 -1) * 25 + 1 AND 1 * 25
造物主在胃中 2016-08-01
  • 打赏
  • 举报
回复
我们这边一般查询逻辑比较复杂的话分页是和客户端共同实现,客户端上第一页的时候传一个last_id 0,我们给第一页的量,传的 last_id大于0时给id小于或大于这的id的一页的量,这样的查询只需要用到TOP @page_size和 where id<或> @last_id order by id desc 或 asc,这样查询效率也高,也能完美达到需求,因为使用到的参数id一般都是聚集索引
Ginnnnnnnn 2016-08-01
  • 打赏
  • 举报
回复
这个你要先看下查询计划是否在处理派生表的时候使用了表扫描。再针对性地解决
baidu_35758285 2016-08-01
  • 打赏
  • 举报
回复
这个不确定节点在哪里,你可以测试一下先查select count(*) FROM 表所需的时间为多少,其次注释掉 and [STATE]=0 和rownum BETWEEN (1-1)*25+1 AND 1*25 依次测试然后放开检查速度慢的节点在哪如果那个条件加上速度突然变慢的话就加个索引吧。
shoppo0505 2016-08-01
  • 打赏
  • 举报
回复
可能你的表格比较大吧. 在CREATEDATE, NEWSTYPE ,STATE上建立复合索引试试看, 然后include ID,NEWSTITLE,SHORTTITLE
北冥小渔 2016-08-01
  • 打赏
  • 举报
回复
试试 OFFSET/FETCH NEXT

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧