SELECT TOP pageSize* FROM Thread WHERE Id NOT IN (SELECT TOP pageIndex * pageSize Id FROM Thread ORDER BY IsTop ASC, LatestReplyDateTime DESC) ORDER BY IsTop ASC, LatestReplyDateTime DESC找了一下原因,主要问题是LatestReplyDateTime排序导致的速度奇慢。Thread也就1000多条,分页要3秒多。LatestReplyDateTime、Id有建立索引,因为LatestReplyDateTime有重复,所以Id是主键。不知道有没有什么办法优化一下?

解决方案 »

  1.   

    where 里面有 NOT IN,not exists 等否定词 会降低速度的。 
      

  2.   

    这个也没办法了,这个分页的原理就是先找出前面的几页的Id,然后再找出后面页的Id并查询出数据了。谁有什么办法优化?
      

  3.   

    刚看了一下discuz论坛的access的分页代码自己解决了。方法是像上面的排序使用的是LatestReplyDateTime,在discuz的分页中只要找到前面页中最小的LatestReplyDateTime就可以了,然后再查询大于这个最小的LatestReplyDateTime的数据。讲起来有点乱。修改后的SQL如下
    SELECT TOP pageSize* FROM Thread WHERE LatestReplyDateTime < (SELECT MIN(LatestReplyDateTime) FROM  (SELECT TOP pageIndex * pageSize LatestReplyDateTime FROM Thread ORDER BY IsTop ASC, LatestReplyDateTime DESC)) ORDER BY IsTop ASC, LatestReplyDateTime DESC 
      

  4.   

    SELECT TOP 页大小 *
    FROM table1
    WHERE id >
              (
              SELECT ISNULL(MAX(id),0) 
              FROM 
                    (
                    SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                    ) A
              )
    ORDER BY id
      

  5.   

    SELECT TOP 2 *
    FROM stu_info
    WHERE id >=
              (
              SELECT  iif( IsNull(max(A.id)), 0, max(A.id) )
              FROM 
                    (
                    SELECT TOP  * FROM stu_info ORDER BY id
                    )  A
              )
    ORDER BY id