要分开取,一次只取其中的一部分,不能全部取出来,才分页,而是一页需要多少就取多少,还有就是SQLserver对来做千万级的数据不会太快
解决方案 »
- ashx文件是干什么的?
- .net开发常用框架是什么组合?
- 一个相当迷惑的问题:shared,Cache,Application关系如何暧昧的?
- 接触.NET有较长时间了,想领做多一些项目(顶者有分)
- 在gridview中如何让某个单元格中的数据是负数的话,让其显示成红色
- 关于数据全选的小问题?
- 将数据导出到Excel2003时不能打开,只有2003才有的问题,请大家帮忙
- sys.webForms.PageRequestManagerParserErrorException
- 初学ASP。NET
- 关于PageLoad中的代码被执行了两次的问题
- 如何把数据查询了在界面显示?急
- 做毕业设计遇到问题,请求各位高手帮忙,谢谢!
肯定是取其中一部分。
我做的是分页存储过程都嘛。
但是只取其中一部分。
sql都被占了300M内存``
page '500'
取500条数据。
在查询分析器中。速度很快。0.5秒`就搞定。
但是`
我在asp.net 程序中执行存储过程。
那麻烦可就大了。
速度爆慢。SQL马上吃300M内存。。
我就不明白。
同样是执行存储过程。
查询同样的数据。
为什么会有这么大的区别?
一个速度快。/不吃内存。
一个速度爆慢。 吃300M内存。。
http://hi.baidu.com/kmiaoer/blog/item/69fccafca22bd583b801a07d.html
如果是直接写的sql那么需要编译的时间 链接打开的时间
还有你使用的不是IIS6 没有 链接池? 这样也会慢很多.看看下面 这里对楼主应该有帮助
http://blog.csdn.net/hertcloud/category/281167.aspx
数据库层的优化 + 应用程优化 (CHCHE数据...)
对于这样大数据量的访问才是安全有效的.
还是没明白。
按道理说。
我实用存储过程进行分页``
在asp.net中掉用存储过程。
取出的数据只有小小的50条。
居然会被sql吃掉300M的内存。同样的取50条记录语句。
放在sql查询分析器中。重我按F5那一刻时间起。不到0.5秒`就在1000万条数据中找了我需要的那50条数据。而且一点不占用内存。。我就是不明白。
同样的语句。
只是换了个地方执行而已。
取出的数据只有50条而已。
为什么前者会被SQL吃掉300M内存。
后者会速度飞快。一点都不吃内存。
.net也是把1000万条先取出来。放到内存中。
在进行筛选。`
比如我sql命令`明确的说明。。我需要取 10000 - 100050 的数据。
放到查询分析器中。对。没错,。的确是取的10000-10050之间的数据。
但是放到sql中就不一样了。
他就管她妈的37 21 先把1000万条弄出来。在内存中。
然后在去用我的SQL语句在内存中筛选`。我想只有这个原因`才会导致sql吃我300M的内存吧!
“但是放到sql中就”
因该是
但是放到asp.net中就
以便学习..呵呵..
(我也认为你用而存储过程取第10000到第10050条记录,.net不会先取出1000W条记录出来后再筛选的,应该是其它问题)
还是那样。
。如果在asp.net 中`调用存储过程取1000万记录中的50条。。
sql马上会吃掉300M内存。
如果在sql查询分析器中调用存储过程取50条。
一点不吃内存。其实在asp.net 中调用存储过程```如果是查询速度慢`。
我能接受。但是吃掉我300M内存。
我实在接受不了。。
我现在连问题都不知道出在哪.
可能是asp.net程序的问题?``
但是程序很简单啊..
连接数据库.调用存储过程.取得反回数据.50条.
显示数据.,50条.
然后.
SQL吃掉300M`内存.
VS相关程序一点都没吃内存.
然后.
我又去查询分析器中执行相同的存储过程.
取相同的数据.
哇靠.
简直是灵异事件`.
执行速度爆块.
一点不吃内存
然后.我就郁闷起了.
改天把我的计算机拿去做下法..
求2道符`.挂起./
看SQL`还吃不吃300M内存
机器爆卡.
即然楼主你用了分页,那基本上就没有很好的办法来从程序上实现了。考虑一下升级硬件。另外,你说你用存储过程取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
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
但是在SQL查询分析器中查询1000万中的50条.
真的速度很快..放到asp.net中就吃内存了`
老纳现丑了:
存储过程:
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 = " ";
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;
}
}
/// 得到每一个大版面开始和结束的数字
/// </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&&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
Pager1.Items = 50;
Pager1.Css = "pager1";
Pager1.currentIndexPageStyle = "curpage";
Pager1.ShowPage();
但是速度真的可以哈.就是不知道为什么放到asp.net程序`就慢了`
你不要动不动就说人垃圾.`
在垃圾也是我自己想出来的.
也许我写的东西在你眼里很垃圾.
但是可能你写的东西在某些人眼里`
是垃圾中的垃圾.
SQL就是爽啊,我的ACCESS就没有这么好的条件写一个分页存储过程。代码我懒得看了,太多了,我想知道的就是你用上下页分页算法会不会很慢?如果用上下页分页算法还是很慢的话那你就只能考虑升级硬件了,如果用上下页分页算法还可以的话,那就有必要讨论下去。
速度并不慢`
起码在SQL查询分析器中执行速度不慢.
就是放到asp.net中`很吃内存.
起码我的写的存储过程.在asp.net中调用`很吃内存..不知道其他人的上下分页的存储过程有不有这种情况.
要知道上下页分页是根据ID来判断的,只可能获取有用的数据集合。
例如
select top 20 from UserTable where ID>@ID
如果这样的都吃内存吃的厉害的话,那就没办法了。我想可能你写的ASP.NET代码有问题,而不是ASP.NET本身有问题