小弟想请教下各位高手们,sql2000数据库如果一个表中的数据有十几到几十万条,一般的查询语句能行吗?不行的话有什么办法解决?小弟没有做过这么大量的数据查询,跪求各位高手,希望能说的详细点。最好能有实例代码。跪求!!!!!!

解决方案 »

  1.   

    如果你用前台程序就很容易实现了。   
      如果想用SQL   Server自己控制的话,(假设表中有一个主键ID叫做“ID”):   
      1。建立一个临时表,只有一个字段“MaxID”   
      2。第一次读取前1000条记录,例如   
      select   top   1000   *   from   tablename   ...   
      3。然后读取该1000条记录中的最大ID号,并将它存储到变量或者临时表。   
      4。接着读取后1000条记录:   
      select   top   1000   *   from   tablename   where   ID   >   maxID   ...   
        
      你可以将这些语句写成存储过程,存储过程的输入参数就是上次读取的最后的ID号(MaxID)。   
        
      这样你的前台程序就可以通过存储过程任意调用其中的一部分记录。   
      至于一次返回多少条记录,可以根据你电脑的配置,一般128的内存,一次返回1000条记录比较适当。  
      

  2.   

    建立索引 create index xx on table(a,b)
    在表table的a b 列建立索引 xx
    drop index xx
    删除索引 xx
      

  3.   

    /*
    create table tmp
    (
    gdate datetime default getdate(),
    gid int 
    )*/
    /*
    declare @i int set @i = 1while @i<1000000
    beginINSERT tmp(gid) values(@i)print '-------' + cast(@i as char(10))
    set @i = @i + 1end
    select count(*) from tmp
    */
    -------------------------------
    --@page 需要取出第几页
    --@pageSize 用于分页时,每页显示的记录数目
    --@blockSize 在大批量数据库中不必每次取pageSize条记录,每次取一批数据,减轻数据库负担
    declare @page int,@pageSize int,@sql char(300),
    @blockSize int,@d datetime
    set @page = 100000
    set @blockSize = 400
    set @pageSize = 20if @page =1
    begin
    set @sql = 'select top ' + cast(@blockSize as varchar) +
    ' * from tmp order by gdate desc '
    end
    else
    begin
    set @sql = 
    'select top ' 

    cast(@blockSize as varchar)

    ' *
    from tmp
    where gdate<
    (select min(gdate) from
    (
    select top '
    +
    cast((@page - 1)* @pageSize as varchar)
    +
    ' gdate from tmp order by gdate desc 
    ) as t
    )
    order by gdate desc'
    endprint @sqlset @d=getdate()exec(@sql)select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
    --select * from t where gid<50000 order by gdate desc用户先根据上面的代码新建一个表tmp
    在实际应用中为测试效率问题,因此插入了1KW条记录进行效率考验
    根据实际测试,效率还非常高,用户在实际应用中可参考或应用上面的代码。不过没有考虑到并发用户访问数据库情况。
    原理:主要是分块取数据,上面代码中每次取400条记录,根据时间排序取数据(最近原则),页面大小和页用户可指定。
      

  4.   

    sql2000 的数据量变大后 ,速度 会变慢的 。要看 你的数据是否并发。
    1,如果非并发,是没有问题,要从数据库方面考虑你的进程和锁的问题。
    2,数据库并发处理你 还是要考虑的。
    3,谨慎用索引 特别是非聚集索引。它是用指针指向 关键字的。
    最重要的是程序开发的节省资源问题。
      总之不要怕
    数据有十几到几十万条,一般的查询语句能行吗    ,可能是可以的,就是你得从节省资源方面 考虑.
      

  5.   


    --方法1:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
              )
    ORDER BY id
    --方法2:
    --适用于 SQL Server 2000/2005
    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
    --方法3:
    --适用于 SQL Server 2005
    SELECT TOP 页大小 * 
    FROM 
            (
            SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
            ) A
    WHERE RowNumber > 页大小*(页数-1)
    --方法四 适用于 SQL Server 2005
    DECLARE @pagenum AS INT, @pagesize AS INT 
    SET @pagenum = 2 
    SET @pagesize = 3 
    SELECT * 
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum, 
            newsid, topic, ntime, hits 
          FROM news) AS D 
    WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize 
    ORDER BY newsid DESC
    说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。
      

  6.   

    建立索引 create index xx on table(a,b) 
    在表table的a b 列建立索引 xx 
    建立索引 create index xx on table(a) 
    在表table的a  列建立索引 xx 
    drop index xx 
    删除索引 xx 在查询分析器里运行以上代码