日期:2014-05-19  浏览次数:20772 次

分页问题(速度超慢)
表中数据才12万条多点
    以前是取出所有数据,在页面中分页的,可时常出现out   of   memory
    现在改用存储过程分页,内存溢出问题已经解决了,没发生过,但却出现SQL超时:Microsoft   OLE   DB   Provider   for   SQL   Server   error   '80040e31 '     Timeout   expired
查了资料,找了原因,,但还是没有解决。

情况是:前面的页面一切正常,只要浏览超过3000左右的页面时,就出现超时
在分析器里执行远程的那个存储过程的结果:
当前页       执行时间(分)
1   00:1
10   00:1
100   00:1
500   00:5
1000   00:8
1500   00:17
2000 00:25
3000 00:51
4000 01:25
5000 02:11
如果查询到最后一页,,好久都没结果出来(等了2分多钟没等下去,就取消了)

存储过程中主要就2条查询语句:
SELECT   COUNT(1)   FROM   tb_actual   WHERE   (   DeletedFlag=0   and   ActualType   =   0   and     TradeID=0   and     keyword   not   like   N '%yd% '   and   ((isnull(Actualname,N ' ')+isnull(address,N ' ')+isnull(companyname,N ' ')+isnull(keyword,N ' '))   like   N '%广州% '   )   )

SELECT   Top   10   ID,ActualName,AgentCode,.......   FROM   tb_actual   WHERE   ID   NOT   IN   (SELECT   TOP   112180   ID   FROM   tb_actual   WHERE   (   DeletedFlag=0   and   ActualType   =   0   and     TradeID=0   and     keyword   not   like   N '%yd% '   and   ((isnull(Actualname,N ' ')+isnull(address,N ' ')+isnull(companyname,N ' ')+isnull(keyword,N ' '))   like   N '%广州% '   )   )     Order   By   ID   Desc)   AND   (   DeletedFlag=0   and   ActualType   =   0   and     TradeID=0   and     keyword   not   like   N '%yd% '   and   ((isnull(Actualname,N ' ')+isnull(address,N ' ')+isnull(companyname,N ' ')+isnull(keyword,N ' '))   like   N '%广州% '   )   )     Order   By   ID   Desc

我所想到的:
1、MSSQL属性中的 "连接 "选项卡 "查询超时设定 "为默认的600秒,我想已经够大了
2、表中自增ID,条件中的字段都建了索引。

存储过程主要就这些语句:


CREATE     PROCEDURE   [dbo].[sp_Wap_ActualSplitPage]
@tblName     NVARCHAR(500)=N 'tb_actual ', --表,视图,查询语句
@fldNames   NVARCHAR(1000)=N '* ', --要显示的字段列表
@PageSize INT=10, --每页显示的记录数
@curPage BIGINT=1   OUTPUT, --当前页
@TotalRecordNum   BIGINT=0   OUTPUT, --总记录数
@fldOrder VARCHAR(255), --关键字段
        @strWhere           NVARCHAR(1000)   =   N ' ',     --查询条件
        @strOrder         NVARCHAR(1000)   =   N ' ',                 --设置排序
.......
AS  

set   nocount   on

declare   @InsideWhere   nvarchar(4000)

DECLARE   @strSQL   NVARCHAR(4000),@strTmpSQL   NVARCHAR(2000),@intTmpRecordNum   INT,@intTmpTotalPage   INT
Select   @strWhere=CASE   ISNULL(@strWhere,N ' ')   WHEN   N ' '   THEN   N '   1=1   '   ELSE   @strWhere   END
Select   @strOrder=CASE   ISNULL(@strOrder,N ' ')   WHEN   N ' '   THEN   N ' '   Els