本人用ASP.NET+ACCESS,但是在大量数据分页时,发现自己写的SQL太慢,如:我的People表有两个字段
id(自增长)和name。 我想查处按名称排列的第11-20条,SQL如下:
SELECT ID, NAME FROM (SELECT TOP 20 ID,NAME FROM PEOPLE ORDER BY NAME) AS P1 WHERE P1.ID NOT IN (SELECT TOP 10 ID FROM PEOPLE ORDER BY NAME);
发现数据在几万条时好慢,请高手指教!

解决方案 »

  1.   

    select top str(页长) * from 表名
                where (列名 >=
                         (select max([列名]) from 
                             (select top str((页数-1)*页长+1) [列名] from [表名]
                                Order by [列名] ASC) as tmpTbl))
              Order by 列名
    这是sql server的 看看。。
      

  2.   

    还有 用存储过程能提高很多。。
    CREATE PROCEDURE GetRecordFromPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
        @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
        @strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
    ASdeclare @strSQL   varchar(6000)       -- 主语句
    declare @strTmp   varchar(100)        -- 临时变量
    declare @strOrder varchar(400)        -- 排序类型if @OrderType != 0
    begin
        set @strTmp = "<(select min"
        set @strOrder = " order by [" + @fldName +"] desc"
    end
    else
    begin
        set @strTmp = ">(select max"
        set @strOrder = " order by [" + @fldName +"] asc"
    endset @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
        + @strOrderif @strWhere != ''
        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
            + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
            + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
            + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrderif @PageIndex = 1
    begin
        set @strTmp = ""
        if @strWhere != ''
            set @strTmp = " where " + @strWhere    set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "]" + @strTmp + " " + @strOrder
    endif @IsCount != 0
        set @strSQL = "select count(*) as Total from [" + @tblName + "]"exec (@strSQL)GO
      

  3.   

    小弟刚学,请问Access里也可以用存储过程吗?
      

  4.   

    找孟子的自定义分页http://dotnet.aspx.cc/
      

  5.   

    忘了,Access不能用存储过程,哈哈
      

  6.   

    哪位高手写一个针对Access的SQl
      

  7.   

    access的话,控制一下datagrid的viewstate,这个东东挺大,所以慢,要是只是显示的话可以禁用它,要是其它操作看datagrid里的控件哪些viewstate不用也禁用掉,速度就会快的
      

  8.   

    我在Access里直接用SQL测试就好慢,还没用在Asp.net上。如果用上去估计会更慢,即使在datagrid上优化也不会快的
      

  9.   

    无可避免,数据量一大,这种分页方式就会受数据库服务器性能的影响。
    两个办法:
    一是在已经做过数据库索引优化的前提下升级服务器配件。
    二是改用另外一种分页方式具体见(在聚簇索引上做文章)http://dev.csdn.net/develop/article/60/60153.shtm
      

  10.   

    我自己的电脑在调试时,直接用asp的recordset分页,或者asp.net的datagrid分页,几万条记录很快的。你的电脑性能也太差了吧。
      

  11.   

    access的查询,.net应用程序都可以使用,类型作为storedprocedure使用的。这个是access查询的sql写法,你可以做个类似的:
    PARAMETERS [PersonalID] Short, [bulletinID] Short, [title] Text ( 255 ), [bulletinDate] DateTime, [content] Text ( 255 );
    INSERT INTO bulletin ( PersonalID, bulletinID, title, bulletinDate, content )
    VALUES ([PersonalID], [bulletinID], [title], [bulletinDate], [content]);