要分开取,一次只取其中的一部分,不能全部取出来,才分页,而是一页需要多少就取多少,还有就是SQLserver对来做千万级的数据不会太快

解决方案 »

  1.   

    我就是只取其中50条记录。
    肯定是取其中一部分。
    我做的是分页存储过程都嘛。
    但是只取其中一部分。
    sql都被占了300M内存``
      

  2.   

    比如`我用存储过程。
    page '500' 
    取500条数据。
    在查询分析器中。速度很快。0.5秒`就搞定。
    但是`
    我在asp.net 程序中执行存储过程。
    那麻烦可就大了。
    速度爆慢。SQL马上吃300M内存。。
    我就不明白。
    同样是执行存储过程。
    查询同样的数据。
    为什么会有这么大的区别?
    一个速度快。/不吃内存。
    一个速度爆慢。 吃300M内存。。
      

  3.   

    这有个快速分页的例子。。你看看 也许有帮助
    http://hi.baidu.com/kmiaoer/blog/item/69fccafca22bd583b801a07d.html
      

  4.   

    你不是使用存储过程来分页?
    如果是直接写的sql那么需要编译的时间 链接打开的时间
    还有你使用的不是IIS6 没有 链接池? 这样也会慢很多.看看下面 这里对楼主应该有帮助
    http://blog.csdn.net/hertcloud/category/281167.aspx
      

  5.   

    SQL语句比存储过程慢这是不容质疑的,而且加上.net的调用时间,再慢点也不足为奇
      

  6.   

    即使使用存储过程来分页(即取部份数据)也建议楼主在数据库方面做适当的优化.当然方法很多.根椐实际情况来定了.而不是真接把所有数据取出到DATASET里.
    数据库层的优化  + 应用程优化 (CHCHE数据...)
    对于这样大数据量的访问才是安全有效的.
      

  7.   

    如果换成ACCESS,有什么好的方法吗?
      

  8.   

    我用oracle也出现这个问题,刚开始我以为是数据库的问题,但后来在sqlplus中看才用1秒钟,估计是数据传输的问题。
      

  9.   

    郁闷``
    还是没明白。
    按道理说。
    我实用存储过程进行分页``
    在asp.net中掉用存储过程。
    取出的数据只有小小的50条。
    居然会被sql吃掉300M的内存。同样的取50条记录语句。
    放在sql查询分析器中。重我按F5那一刻时间起。不到0.5秒`就在1000万条数据中找了我需要的那50条数据。而且一点不占用内存。。我就是不明白。
    同样的语句。
    只是换了个地方执行而已。
    取出的数据只有50条而已。
    为什么前者会被SQL吃掉300M内存。
    后者会速度飞快。一点都不吃内存。
      

  10.   

    我想来想去都想不出问题在哪。我猜测。就算我取50条数据出来。
    .net也是把1000万条先取出来。放到内存中。
    在进行筛选。`
    比如我sql命令`明确的说明。。我需要取 10000 - 100050 的数据。
    放到查询分析器中。对。没错,。的确是取的10000-10050之间的数据。
    但是放到sql中就不一样了。
    他就管她妈的37 21 先把1000万条弄出来。在内存中。
    然后在去用我的SQL语句在内存中筛选`。我想只有这个原因`才会导致sql吃我300M的内存吧!
      

  11.   

    上面写错了句话。
    “但是放到sql中就”
    因该是
    但是放到asp.net中就
      

  12.   

    不会  你不是说在 asp.net中也用存储过程么 那样返回的数据 肯定不会是1000W 只会返回你取的 应该是别的方面的问题吧
      

  13.   

    虽然我知道的楼上都已经有人回答了,但希望楼主在问题解决后能把原因公布出来一下.
    以便学习..呵呵..
    (我也认为你用而存储过程取第10000到第10050条记录,.net不会先取出1000W条记录出来后再筛选的,应该是其它问题)
      

  14.   

    一直都没解决。
    还是那样。
    。如果在asp.net 中`调用存储过程取1000万记录中的50条。。
    sql马上会吃掉300M内存。
    如果在sql查询分析器中调用存储过程取50条。
    一点不吃内存。其实在asp.net 中调用存储过程```如果是查询速度慢`。
    我能接受。但是吃掉我300M内存。
    我实在接受不了。。
      

  15.   

    楼主能不能把你的sql分页存储过程发出来看看?
      

  16.   

    郁闷死咯.
    我现在连问题都不知道出在哪.
    可能是asp.net程序的问题?``
    但是程序很简单啊..
    连接数据库.调用存储过程.取得反回数据.50条.
    显示数据.,50条.
    然后.
    SQL吃掉300M`内存.
    VS相关程序一点都没吃内存.
    然后.
    我又去查询分析器中执行相同的存储过程.
    取相同的数据.
    哇靠.
    简直是灵异事件`.
    执行速度爆块.
    一点不吃内存
    然后.我就郁闷起了.
    改天把我的计算机拿去做下法..
    求2道符`.挂起./
    看SQL`还吃不吃300M内存
    机器爆卡.
      

  17.   

    这个有点麻烦,毕竟是1000万条数据。
    即然楼主你用了分页,那基本上就没有很好的办法来从程序上实现了。考虑一下升级硬件。另外,你说你用存储过程取50条数据也占300MB内存,你存储过程是怎么写的?能不能发个代码看看。万一不行的话,我建议你用一下上下页分页算法。虽然易用性差了点,但速度却是最快的,而且占用内存也非常少。
    地址:http://www.xproer.com/web/article/data.aspx?aid=174&cid=14&aname=%u4E0A%u4E0B%u9875%u5206%u9875%u7B97%u6CD5%u8BB2%u89E3&atime=2007-4-23 13:02:54&alook=4&author=Xproer
      

  18.   

    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    ALTER       proc ceshi
    @xuanze char(1), --1为上页 0 为下页
    @top char(5), --取多少条记录
    @id char(10), --ID值
    @id_ziduan char(20), --ID字段
    @table char(20), --表
    @where varchar(1000) --条件
    as
    declare @sql varchar(1000) --储存SQL执行语句
    begin
    if @where=''
    begin
    if @xuanze = '0'
    begin
    if @id <> '0'
    set @sql = 'select top '+@top+' * from '+@table+' where '+@id_ziduan+' < '+@id+' order by ['+@id_ziduan+'] desc ' 
    else
    set @sql = 'select top '+@top+' * from '+@table+' order by '+@id_ziduan+' desc'
    end
    else
    begin
    set @sql = 'select * from (select top '+@top+' * from '+@table+' where ['+@id_ziduan+']>'+@id+' order by '+@id_ziduan+' asc)as '+@table+' order by ['+@id_ziduan+'] desc'

    endend
    else
    begin
    if @xuanze = '0'
    begin
    if @id <> '0'
    set @sql = 'select top '+@top+' * from '+@table+' where '+@id_ziduan+' < '+@id+' and '+@where+' order by ['+@id_ziduan+'] desc ' 
    else
    set @sql = 'select top '+@top+' * from '+@table+' where '+@where+' order by '+@id_ziduan+' desc'
    end
    else
    begin
    set @sql = 'select * from (select top '+@top+' * from '+@table+' where ['+@id_ziduan+']>'+@id+' order by ['+@id_ziduan+'] asc)as '+@table+' where '+@where+' order by '+@id_ziduan+' desc'

    end
    end
    exec (@sql)
    endGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  19.   

    算法比较简单...
    但是在SQL查询分析器中查询1000万中的50条.
    真的速度很快..放到asp.net中就吃内存了`
      

  20.   

    楼主,你这垃圾写的代码也太垃圾了吧
    老纳现丑了:
    存储过程:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    /*装载指定位置的指定数量的记录*/
    ALTER PROCEDURE [dbo].[Pbl_LoadData]
    (
    @pageSize int,--当前是第几页
    @rows int,--每页显示的行数
    @tableName nvarchar (30),--要读取的表名
    @ID nvarchar (40),--表中唯一的关键字段
    @where nvarchar (200),--条件,不带where的
    @gz nvarchar (1000)--排序规则,不带order by ,直接写字段和规则就可以
    )
    AS
    BEGIN
    declare @cmd nvarchar (2000)
    if @rows=0 or @pageSize=0
    begin
    set @cmd='select * from '+  @tableName +'  where '+ @ID+ ' not in(select top 0 ' + @id +'  from ' +@tablename +'  where 1=1'+@where +@gz +') '+@where +@gz
    end
    else
    begin
    set @cmd='select top ' +cast( @rows as nvarchar (10))+'  * from '+  @tableName +'  where '+ @ID+ ' not in(select top '+ cast((@pageSize-1)*@rows  as nvarchar (10)) + ' ' + @id +'  from ' +@tablename +'  where 1=1'+@where +@gz +') '+@where +@gz
    end
    print @cmd
    exec sp_executesql @cmd
    END
    这个存储过程可以取任意表或视图的任意位置的任意数据.
    以下是分页代码.你建立一个用户控件.把代码搞进去:
    /* 这是一段分页的程序代码,由俺2007-1-31号完成
     * 调用时请先新增加一个用户控件,在上面拖一个标签.
     * 用户控件的代码如下
     * 调用方式为:
     * 1.先设置本分页控件的记录总数,一般为所读取的全部记录的数量.如
     *   Pager1.Record = query.Records;
     * 2.设置每页每版显示的记录条数.如
     *   Pager1.Items = 15;
     * 3.设置每个大版面显示的页面数量.请设置 nm的值,默认为:10
     * 4.调用此方法: Pager1.ShowPage();
    */
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class Pager : System.Web.UI.UserControl
    {
        #region 属性
        private string PREV = "<span  style=\" font-family:Webdings\">7</span>";
        private string NEXT = "<span  style=\" font-family:Webdings\">8</span>";
        private string FIRST = "<span style=\" font-family:Webdings\">9</span>";
        private string LAST = "<span  style=\" font-family:Webdings\">:</span>";
        private string SPACE = "&nbsp;";
        private int nm = 10;//每版显示10页
        private string _css;
        /// <summary>
        /// 此处用来设置连接的样式
        /// </summary>
        public string Css
        {
            get { return _css; }
            set { _css = value; }
        }
        private string _ci;
        /// <summary>
        /// 设置当前页的数字的样式
        /// </summary>
        public string currentIndexPageStyle
        {
            get { return _ci; }
            set { _ci = value; }
        }
        private int _record;
        /// <summary>
        /// 设置或得到全部的记录数
        /// </summary>
        public int Record
        {
            set { _record = value; }
            get { return _record; }
        }
        private int _items;
        /// <summary>
        /// 每页显示的记录数
        /// </summary>
        public int Items
        {
            get { return _items; }
            set { _items = value; }
        }
        /// <summary>
        /// 总共有几页
        /// </summary>    
        private int PageTotal
        {
            get
            {
                if (Record % Items == 0)
                    return Record / Items;
                else
                    return (Record / Items) + 1;
            }
        }
        /// <summary>
        /// 得到表中的记录数总共可以分几个大范围
        /// </summary>
        /// <returns></returns>
        private int GetBigFws
        { 
            get
            {
                if(PageTotal % nm==0)
                    return PageTotal / nm;
                else
                    return (PageTotal /nm )+1;
            }
        }
        #endregion    /// <summary>
        /// 得到每一个连接的参数
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private string getUrl(string index)
        {
            string Url = string.Empty;
            for (int i = 0; i < Request.QueryString.Count; i++)
            {
                if (Request.QueryString.GetKey(i).ToLower() != "pageindex")
                {
                    Url = Url + "&" + Request.QueryString.GetKey(i).ToString() + "=" + Server.UrlEncode(Request.QueryString[i].ToString());
                }
            }
            Url = Request.Path + "?pageindex=" + index + Url;
            return Url;
        }
        /// <summary>
        /// 得到当前在第几个大饭围内
        /// </summary>
        /// <returns></returns>
        private int CurrentBigfw
        {
            get
            {
                int pages = 0;
                int pindex = 1;
                if (Request.QueryString["pageindex"] != null)
                {
                    try
                    {
                        pindex = int.Parse(Request.QueryString["pageindex"]);
                    }
                    catch { }
                }
                pages = pindex / nm;//确定当前在第几个饭围内
                if (pindex % nm == 0)
                    pages--;
                return  pages + 1;
            }
        }
      

  21.   

    /// <summary>
        /// 得到每一个大版面开始和结束的数字
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        private void getStartEnd(ref int start, ref int end)
        {
            int cur =CurrentBigfw;
            start = (cur - 1) * nm + 1;
            end = cur * nm;
            if (end > PageTotal)
                end = PageTotal;
       
        }
        /// <summary>
        /// 得到数字连接的数字,类似于 1 2 3 4 5 6 7 8
        /// </summary>
        /// <returns></returns>
        private string getNumber()
        {
            string mid = string.Empty;
            int start = 0;
            int end = 0;
            getStartEnd(ref start, ref end);
            string  curindex = "1";
            if (Request.QueryString["pageindex"] != null)
                curindex=Request.QueryString["pageindex"];
            for (int i =start; i <= end; i++)
            {
                if (i.ToString() == curindex)//cur为当前的页面数,如果等于当前的页面数,则不给它设置超连接
                    mid = mid + "<span class='" + currentIndexPageStyle + "' >" + i.ToString() + "</span>" + SPACE;
                else
                    mid = mid + "<a class='"+Css+"' href='" + getUrl(i.ToString()) + "'>" + i.ToString() + "</a>" + SPACE;
            }
            return mid;
        }
        /// <summary>
        /// 分页的方法,要调用这个
        /// </summary>
        public void ShowPage()
        {
            if (Record == 0) { //当前无记录
                LblNvbar.Text = "分页:" + FIRST + SPACE + PREV + SPACE+"当前无记录"+SPACE + NEXT + SPACE + LAST ; 
            }
            else  {
                int start = 0;
                int end = 0;
                getStartEnd(ref start, ref end);
                if(CurrentBigfw==1)            
                { //在第一个版面内
                    if (Record <= (nm * Items))//在第一个版面内,肯内有一个版面,四个箭头不可用
                        LblNvbar.Text = "分页:" + FIRST + SPACE + PREV + SPACE + getNumber() + NEXT + SPACE + LAST + "第" + Request.QueryString["pageindex"] + "页共" + PageTotal.ToString() + "页.共" + Record.ToString() + "条记录";
                    else{//在第一个版面内,有多个版面.三四个版面可用
                        LblNvbar.Text = "分页:" + FIRST + SPACE + PREV + SPACE + getNumber() + "<a class='" + Css + "' href='" + getUrl((nm + 1).ToString()) + "'>" + NEXT + "</a>" + SPACE + "<a class='" + Css + "' href='" + getUrl(PageTotal.ToString()) + "'>" + LAST + "</a>" + "第" + Request.QueryString["pageindex"] + "页共" + PageTotal.ToString() + "页.共" + Record.ToString() + "条记录";
                    }
                }
                else if (CurrentBigfw == GetBigFws)         { //最后一页
                    LblNvbar.Text = "分页:" + "<a class='" + Css + "' href='" + getUrl("1") + "'>" + FIRST + "</a>" + SPACE + "<a class='" + Css + "' href='" + getUrl((start - 1).ToString()) + "'>" + PREV + "</a>" + SPACE + getNumber() + NEXT + SPACE + LAST + "第" + Request.QueryString["pageindex"] + "页共" + PageTotal.ToString() + "页.共" + Record.ToString() + "条记录";
                }
                else
                {
                    LblNvbar.Text = "分页:" + "<a  class='" + Css + "' href='" + getUrl("1") + "'>" + FIRST + "</a>" + SPACE + "<a class='" + Css + "' href='" + getUrl((start - 1).ToString()) + "'>" + PREV + "</a>" + SPACE + getNumber() + "<a class='" + Css + "' href='" + getUrl((end + 1).ToString()) + "'>" + NEXT + "</a>" + SPACE + "<a class='" + Css + "' href='" + getUrl(PageTotal.ToString()) + "'>" + LAST + "</a>" + "第" + Request.QueryString["pageindex"] + "页共" + PageTotal.ToString() + "页.共" + Record.ToString() + "条记录";
                }                    }
        }}
    如果需要有上输入指定页的文本框,你自己加一上进去.送你一个验证的代码加到文本框中: onkeypress="return event.keyCode>=48&amp;&amp;event.keyCode<=57" onpaste="var s=clipboardData.getData('text'); if(!/\D/.test(s)) value=s.replace(/^0*/,''); return false;"
    可设置发页的样式.样式代码如下:
        <style>
        <!--
        A.pager1:link {text-decoration:none;color:#021F53;font-size:10pt;}
    A.pager1:visited {text-decoration:none;color:#021F53;font-size:10pt;}
    A.pager1:active{text-decoration:underline;color:#AAAAAA;}
    A.pager1:hover {text-decoration:underline;color:#3D76AF;}
    .curpage {
    color:#C6972D;
    font-size:10pt;
    font-weight: bold;
    text-decoration:none;
    }
        -->
        </style>
    放在前台的视图中
    调用如下:
          Pager1.Record = dt.Rows.Count;
            Pager1.Items = 50;
            Pager1.Css = "pager1";
            Pager1.currentIndexPage
      

  22.   

    Pager1.Record = dt.Rows.Count;
            Pager1.Items = 50;
            Pager1.Css = "pager1";
            Pager1.currentIndexPageStyle = "curpage";
            Pager1.ShowPage();
      

  23.   

    拉是垃圾.
    但是速度真的可以哈.就是不知道为什么放到asp.net程序`就慢了`
      

  24.   

    还有`随便我鄙视 下 hbtm   
    你不要动不动就说人垃圾.`
    在垃圾也是我自己想出来的.
    也许我写的东西在你眼里很垃圾.
    但是可能你写的东西在某些人眼里`
    是垃圾中的垃圾.
      

  25.   

    hbtm(初中学历)这位大哥的分页代码代码太多了。to:leehom216()
    SQL就是爽啊,我的ACCESS就没有这么好的条件写一个分页存储过程。代码我懒得看了,太多了,我想知道的就是你用上下页分页算法会不会很慢?如果用上下页分页算法还是很慢的话那你就只能考虑升级硬件了,如果用上下页分页算法还可以的话,那就有必要讨论下去。
      

  26.   

    上下分页``
    速度并不慢`
    起码在SQL查询分析器中执行速度不慢.
    就是放到asp.net中`很吃内存.
    起码我的写的存储过程.在asp.net中调用`很吃内存..不知道其他人的上下分页的存储过程有不有这种情况.
      

  27.   

    不可能吧?如果连上下页分页都这么慢的话,那就只有考虑升级硬件了。
    要知道上下页分页是根据ID来判断的,只可能获取有用的数据集合。
    例如
    select top 20 from UserTable where ID>@ID
    如果这样的都吃内存吃的厉害的话,那就没办法了。我想可能你写的ASP.NET代码有问题,而不是ASP.NET本身有问题