数据优化,从数据库到代码,希望大家多给点意见?

大石谭 2009-04-28 06:40:45
数据优化,从数据库到代码,希望大家多给点意见?
网站现有数据20多万,每天新增数据1万多,现在网站打开很慢。
环境:.net2.0+SQL2000
以前老超时,我加大了Command和Connection超时时间,但还是很慢
我现在用了缓存,优化了一些SQL语句,分页用的存储过程实现,但网站打开速度还是很慢
是我的分页存储过程有问题?还是数据量大了(就现在这样),就会出现这种情况
网站现在已经在运行了,这样肯定不行,怎么花最少的代价,解决这个问题?
各位大侠有什么好的方法不?
附上现在的存储过程:

CREATE PROC Proc_GetPagedData
(
@Tables varchar(1000),/*表名*/
@Fields varchar(1000) = '*',/*字段*/
@PrimaryKey varchar(100),/*主键*/
@CurrentPage int = 1,/*第几页*/
@PageSize int = 10,/*页大小*/
@Filter varchar(1000) = NULL,/*条件*/
@Sort varchar(200) = NULL,/*排序*/
@Group varchar(1000) = NULL/*群组*/
)
AS
/*默认排序*/
IF @Sort IS NULL or @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int
/*设定排序语句.*/
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) > 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
Select @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
/*筛选以及分组语句.*/

IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' Where ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/*执行查询语句*/
EXEC(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
Select @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
Select ' + @Fields + ' FROM ' + @Tables + ' Where ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + '
'
)
GO
...全文
145 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghao3616 2009-04-29
  • 打赏
  • 举报
回复
插入数据很慢 就说明
有些sql语句的执行时间过长
导致其他 sql语句等待
大石谭 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 delphi_new 的回复:]
应该是你的程序问题吧,比如死循环,非托管资源未释放等等,20万并不是很大
[/Quote]
现在就插入一条语句,在SQL Profile里看也很慢,取数据慢可以理解为程序问题,插入,更新数据呢?
delphi_new 2009-04-29
  • 打赏
  • 举报
回复
应该是你的程序问题吧,比如死循环,非托管资源未释放等等,20万并不是很大
lijie9693 2009-04-29
  • 打赏
  • 举报
回复
学习中》。
zhgroup 2009-04-29
  • 打赏
  • 举报
回复
分页的存储过程建议你搜一下邹建写的那个,那个按主键查询速度很快
另外,20W数据不是太多,50W以上,建议将数据分离,即将数据按时间段分离,然后按时间段查询,也可以使用第三方工具(比如像搜索引擎)这样的,像它提出请求,让它去处理分页,然后根据它返回的数据再处理显示,我现在有个项目就是采用这种试工,100W以上的数据量,用分页存储过程,除非用默认的主键做为条件查询,否则如果有字符串查询,速度都很慢,我现在就是用的第三方工具,现在速度已经很快了
陌上花花 2009-04-29
  • 打赏
  • 举报
回复
帮顶了。
大石谭 2009-04-29
  • 打赏
  • 举报
回复
有没关闭的Connection,不过是SqlDataReader
是这样写的:

public static SqlDataReader ExecuteReader( CommandType cmdType , string cmdText , params SqlParameter[] commandParameters )
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection( ConnectionStringLocalTransaction );

// we use a try/catch here because if the method throws an exception we want to
// close the connection throw code, because no datareader will exist, hence the
// commandBehaviour.CloseConnection will not work
try
{
PrepareCommand( cmd , conn , null , cmdType , cmdText , commandParameters );
SqlDataReader rdr = cmd.ExecuteReader( CommandBehavior.CloseConnection );
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
}

用完后会自动关闭吧
大石谭 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sayluyun 的回复:]
可能是你的程序代码有问题··比如数据库连接之后是否关闭,是否存在死循环 等····
[/Quote]
死循环不会报错吗?这个应该不存在,因为刚开始的时候网站运行得好好的
sayluyun 2009-04-29
  • 打赏
  • 举报
回复
可能是你的程序代码有问题··比如数据库连接之后是否关闭,是否存在死循环 等····
中年秃头大叔 2009-04-29
  • 打赏
  • 举报
回复
补充:
1.在连接数据库时最好也用上缓冲池。
server=;database=数据库名;uid=sa;pwd=;max pool size=10000;min pool size=1
//max pool size 为最大缓冲次数,min pool size 最少缓冲次数。自己可了定义大小。
2.connection连接超时,可以用系统的using(),这样不用的连接系统会自己收回,不用去关心连接是否关闭或超时。
3.另外最主要的是服务器配制的问题。
skymanone 2009-04-29
  • 打赏
  • 举报
回复
建议楼主改用SQL SERVER 2005试试,

强烈关注!
大石谭 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chenyunkun2008 的回复:]
我给点小建议,:

用存储过程分页这个可以节省很多时间,这个是肯定 的,

其次你的DBHelper类里面最好用using 来释放资源,

最好不要用reader尽量用dataSet这样可以减少程序与数据库之间交互。。

以上是我的建议
[/Quote]
先谢谢了
我在DBHelper里除了要返回datareader的外,全用的是using
用reader也就是取完数据就关了
要不用就用datatable?这两个比较,哪个效率比较高,占用的资源少?
chenyunkun2008 2009-04-29
  • 打赏
  • 举报
回复
我给点小建议,:

用存储过程分页这个可以节省很多时间,这个是肯定 的,

其次你的DBHelper类里面最好用using 来释放资源,

最好不要用reader尽量用dataSet这样可以减少程序与数据库之间交互。。

以上是我的建议
大石谭 2009-04-29
  • 打赏
  • 举报
回复
放在服务器上,肯定要用连接池,
这个好像是服务器管理的吧,在程序里也能创建吗?
蓝海D鱼 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wanghao3616 的回复:]
插入数据很慢 就说明
有些sql语句的执行时间过长
导致其他 sql语句等待
[/Quote]up

建议楼主 创建 SQL server 连接池, 用连接池 管理 连接

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧