有一表(ProductInfo)有20万条记录,写出它的分页sql语句。表中有ID(int) 标识列,要求性能好,效率高!注:区限记录(beginrecord,endrecord)  每页20记录 当前页pageIndex我写了两个:
1、select * from (select *,ROW_NUMBER() OVER(ORDER BY ID Asc) AS 'rownumber' from ProductInfo) T 
where T.rownumber between  beginrecord and endrecord2、select top(20) * from ProductInfo 
where (id not in (select top(20*(pageIndex-1)) ID from ProductInfo order by ID)) 
order by ID Asc我发现 数据库 一大。同时访问的人多 ,很耗性能,
请问 大家有 更改 的 办法没有

解决方案 »

  1.   

    id上有索引吧。还有动态的尽量用
    exec sp_executesql 
      

  2.   


    select top 20 * from productinfo where id>
    (select max(id) from 
    (select top (20*(pageIndex-1)) ID from ProductInfo order by ID)a)
    order by id--将id设置为主键。
      

  3.   

    不知道你们的服务器每秒有多少个读取请求。立竿见影的办法,如果还没有做的话,叫DBA把数据库复制8个。另:分页一般是需要app里cache结果才能达到最佳效果的,光靠数据库不是最好的办法。
      

  4.   

    to geliph你说的我没有明白。
    数据读取相当频繁,一秒钟有200-500个查询请求,这样该如何处理,请高人指点啊
      

  5.   

    把这个数据库复制到8个服务器上,其中分出4个专门处理有关分页的查询,另四个处理别的查询。这是做到数据库的分工。同时检查App里的cache,根据实际情况调节cache的时间。.net就可以很方便的做了。这是保证不让所有的请求都直接变成最昂贵的数据库请求。但很多大公司都有专门的cache系统,把最近100来天的查询都放到内存里了。你的情况现在只有20万的数据,只是分页查询请求很多,我猜是你们的App没用上cache的问题,不知道是不是?你设个10分钟试试看。
      

  6.   

    我的程序是  socekt 服务,接到请求查询数据 然后返回给各个客户端  
      

  7.   

    在socket服务里写个堆栈,把10分钟内的请求和结果全cache起来。就算cache 1分钟,你的整个系统性能也会大幅提升。事实上,只要不是real time的都可以cache,而real time的数据又需要加锁防止修改的,所以完全没有必要每个请求都去查数据库。不知道你们的架构师是怎么设计的。应该有个cost per call的调查和计划。