Insert数据耗时越来越长

xian_wwq 2009-06-23 01:22:53
数据表:
表名AvgData
主键为TimeStamp TagName OperatorTurn

列名 数据类型 允许为空
TimeStamp DateTime No
TagName varchar(30) No
OperatorTurn smallint No
Value float yes
Quality smallint yes

存储过程

ALTER PROCEDURE [dbo].[proc_avgdata_AddUpdateavgdata]
@Timestamp datetime,
@TagName varchar(30),
@OperatorTurn smallint,
@Value float,
@Quality smallint
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
if exists(select 1 from avgdata where TimeStamp=@Timestamp and TagName=@TagName)
begin
update avgdata set OperatorTurn=@OperatorTurn,Value=@Value, Quality=@Quality
where TimeStamp=@Timestamp and TagName=@TagName
end
else
begin
insert into avgdata (TimeStamp,TagName,OperatorTurn,Value,Quality)
values(@Timestamp,@TagName,@OperatorTurn,@Value,@Quality)
end
END


症状描述:
每小时插入5000条记录,整个操作花费时间越来越长.
刚开始2分钟以内,6个小时后,需要10分钟左右。
不调用存储过程,直接使用sql语句,进行DataSet的updata,症状相同。

因为存储数据量比较大,要保存2年的数据,使用了分区,不知道有没有影响?
请高手指点。谢谢。
...全文
559 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2009-06-25
  • 打赏
  • 举报
回复
谢谢各位指点,最终改用bulk insert,效率很高,秒级完成。
jeffkxt 2009-06-25
  • 打赏
  • 举报
回复
估计是索引搞得太多了,所以影响了速度,可以考虑后台插入
ChinaJiaBing 2009-06-24
  • 打赏
  • 举报
回复

表建上索引试试.
xian_wwq 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ai_li7758521 的回复:]
一般的情况下,如果插入数据比较频繁的话,数据库可以不即时插入,逻辑层暂时保留欲插入数据,然后定时一次性插入,性能可能会好。
[/Quote]
修改为批量写入

/// <summary>
/// 批量写入小时汇总
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public bool UpdataHourBatch(List<SaveHourData> data,string tableName)
{
bool flag = false;
try
{
if (data != null && data.Count > 0)
{
string sql = "select top 1 * from " + tableName + " where TimeStamp >'" + data[0].TimeStamp.ToString() + "'";

SqlDataAdapter adatper = new SqlDataAdapter();
adatper.SelectCommand = new SqlCommand(sql, instance);
SqlCommandBuilder scb = new SqlCommandBuilder(adatper);
DataSet ds = new DataSet();
adatper.Fill(ds, tableName);
if (ds.Tables != null && ds.Tables.Count > 0)
{
DataTable addTable = ds.Tables[0].Clone();
for (int i = 0; i < data.Count; i++)
{
DataRow dr = addTable.NewRow();
dr["TimeStamp"] = data[i].TimeStamp;
dr["TagName"] = data[i].TagName;
dr["OperatorTurn"] = data[i].Turn;
dr["Value"] = data[i].Value;
dr["Quality"] = data[i].Quality;
addTable.Rows.Add(dr);
}
ds.Tables[0].Merge(addTable, true, MissingSchemaAction.Add);
adatper.Update(ds, tableName);
ds.Tables[tableName].AcceptChanges();
flag = true;
}
else
{
FileLog.FileLog.WriteTextToFile("Write " + tableName + " Error:Dataset 为空");
}

}
}
catch (Exception ex)
{
FileLog.FileLog.WriteTextToFile("Write " + tableName+ " Error:" + ex.Message.ToString());
flag = false;
}
return flag;
}



感觉性能改善不明显,用时还是在增加
ai_li7758521 2009-06-23
  • 打赏
  • 举报
回复
一般的情况下,如果插入数据比较频繁的话,数据库可以不即时插入,逻辑层暂时保留欲插入数据,然后定时一次性插入,性能可能会好。
人鱼传说 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 olddown 的回复:]
实时性要求不高的话,定时的批量插入大量新数据。代码来控制。
[/Quote]
有道理,如果实时性高的话,这个还可以优化一下

if exists(select 1 from avgdata where TimeStamp=@Timestamp and TagName=@TagName)



if exists(select top 1 1 from avgdata where TimeStamp=@Timestamp and TagName=@TagName)
ai_li7758521 2009-06-23
  • 打赏
  • 举报
回复
数据量影响,比如
select 1 from avgdata where TimeStamp=@Timestamp and TagName=@TagName
用时会越来越长。如果满足TimeStamp=@Timestamp and TagName=@TagName条件的记录很多,可以改为
select top 1 1 from avgdata where TimeStamp=@Timestamp and TagName=@TagName
menggang9801 2009-06-23
  • 打赏
  • 举报
回复
查查日志里面有没有死锁,如果有的话,使用trace flag 1224防止锁升级看看有没有帮助。
xian_wwq 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 claro 的回复:]
引用 3 楼 xian_wwq 的回复:
现在搞不清楚是什么在影响insert效率,而且影响这么大?
和主键太多有关系吗?
请指点

是数据量增大的缘故。
[/Quote]

这个级别的数据量,应该不需要使用bulk insert吧?如何解决?谢谢
claro 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xian_wwq 的回复:]
现在搞不清楚是什么在影响insert效率,而且影响这么大?
和主键太多有关系吗?
请指点
[/Quote]是数据量增大的缘故。
JonasFeng 2009-06-23
  • 打赏
  • 举报
回复
加聚合索引吧。
效果估计会高点。
xian_wwq 2009-06-23
  • 打赏
  • 举报
回复
现在搞不清楚是什么在影响insert效率,而且影响这么大?
和主键太多有关系吗?
请指点
Zoezs 2009-06-23
  • 打赏
  • 举报
回复
看看你的索引是否需要Reindex下
你可以试着转移部分数据到另一张表。
olddown 2009-06-23
  • 打赏
  • 举报
回复
实时性要求不高的话,定时的批量插入大量新数据。代码来控制。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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