怎么 进行大量的数据更新 效率高

时间:2021-04-17 07:58:09
环境是: 数据库数据量大概有1千万。
然后数据会频繁的进行更新。 

我现在用多条update语句一次进行更新,100条,大概要0.4秒左右。。效率不够,更新来不及。


请教一下, 还能用什么办法能更快的更新呢?

SqlDataAdapter 这个能提高效率吗 ?

24 个解决方案

#1


更新如何来不及,数据库肯定不会提示你来不及更新

#2


恩。 就是速度有点慢。  

#3


进行100次交互(递交 UPDATE 语句)的花费通常比数据库正真进行更新动作的花费要慢。
建议改用 表值参数 (ADO.NET),这样只需要交互一次就能把100条语句一次性更新。

#4


多条update语句?就是你update 100条数据你就执行了100次update ?
这样的话你就可以要么选择用xml 做参数或者用datatable 做参数使用存储过程来批量更新,这样应该效率会高一点

#5


引用 3 楼 Tiger_Zhao 的回复:
进行100次交互(递交 UPDATE 语句)的花费通常比数据库正真进行更新动作的花费要慢。
建议改用 表值参数 (ADO.NET),这样只需要交互一次就能把100条语句一次性更新。





这个是个思路,  得学习一下 表值参数的知识。

#6


引用 4 楼 KanzakiOrange 的回复:
多条update语句?就是你update 100条数据你就执行了100次update ?
这样的话你就可以要么选择用xml 做参数或者用datatable 做参数使用存储过程来批量更新,这样应该效率会高一点




是的,就是100条update 语句,一次执行。
SqlDataAdapter  好像可以直接更新datatable, 但是不知道效率会怎么样。

#7


检查下执行计划,是否通过非聚集索引去更新的。另外检查下表有多少非聚集索引,聚集索引在什么字段上。
update的不仅仅是更新自己的数据,还会影响聚集索引,非聚集索引的内容

#8


引用 7 楼 wstoneh01 的回复:
检查下执行计划,是否通过非聚集索引去更新的。另外检查下表有多少非聚集索引,聚集索引在什么字段上。
update的不仅仅是更新自己的数据,还会影响聚集索引,非聚集索引的内容



是根据主key进行更新的。  其他非聚集索引是几个int型和numeric型字段。  

#9


方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况

#10


更新是否用的索引,比较重要

#11


引用 9 楼 wstoneh01 的回复:
方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

#12


引用 11 楼 denshanzhe 的回复:
Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#

#13


引用 12 楼 wstoneh01 的回复:
Quote: 引用 11 楼 denshanzhe 的回复:

Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#



实在是抱歉, 语句也没有, 都是程序跑起来生成的,现在也没有环境。   而更新  语句 其实是根据ID,更新全字段。 这些字段包含,int型,numeric型,time型,还有较多的nvarchar型。。 这个类型对更新有影响么?   


#14


引用 13 楼 denshanzhe 的回复:
Quote: 引用 12 楼 wstoneh01 的回复:

Quote: 引用 11 楼 denshanzhe 的回复:

Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#



实在是抱歉, 语句也没有, 都是程序跑起来生成的,现在也没有环境。   而更新  语句 其实是根据ID,更新全字段。 这些字段包含,int型,numeric型,time型,还有较多的nvarchar型。。 这个类型对更新有影响么?   



通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。

#15


让数据库管理员,抓一下sql profiler,看一下实际运行情况。

#16


引用
通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。



因为这些是我家里的电脑上跑的效果,我现在回了老家,拿不到具体的数据。 

不过你说的也有道理,可能我电脑只能达到这个速度了。 而我是想看能不能再优化一下。 我自己的电脑就是普通台式机,cpu是A8的。 数据有1千万多一点。现在是测试,感觉速度有点慢。

那 请教一下,对于这样的大的数据,怎么能更新的更快呢?  而且是一台电脑, 我现在update的时候,进行查询的话 ,update就卡住了。 这个要怎么解决呢? 十分感谢。

#17


可以考虑脏读,select *from a with(nolock)

#18


单语法update视图的效率会比update表好,update大表有聚集索引的效率好,果然是主键更新,那么非聚集索引要少。

#19


建议按可控的规则(如全国数据按省份分)将表拆分为多个小表,增加数据并发性!

#20


引用 17 楼 wstoneh01 的回复:
可以考虑脏读,select *from a with(nolock)



即使用with(nolock),好像还是会卡的 。   我计划再弄个表,更新的时候直接插入,然后用存储过程来同步2个表。

#21


引用 19 楼 cxmcxm 的回复:
建议按可控的规则(如全国数据按省份分)将表拆分为多个小表,增加数据并发性!


已经做过查分。但是有个表有1千多万数据。 再拆就比较困难了。

#22


引用 16 楼 denshanzhe 的回复:
引用
通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。



因为这些是我家里的电脑上跑的效果,我现在回了老家,拿不到具体的数据。 

不过你说的也有道理,可能我电脑只能达到这个速度了。 而我是想看能不能再优化一下。 我自己的电脑就是普通台式机,cpu是A8的。 数据有1千万多一点。现在是测试,感觉速度有点慢。

那 请教一下,对于这样的大的数据,怎么能更新的更快呢?  而且是一台电脑, 我现在update的时候,进行查询的话 ,update就卡住了。 这个要怎么解决呢? 十分感谢。

A8 是什么cpu?
如果测试环境与生产不一致,调试效率是没用的。不同的硬件性能不同的设置数据库的处理瓶颈都不一样。

#23



A8 是什么cpu?
如果测试环境与生产不一致,调试效率是没用的。不同的硬件性能不同的设置数据库的处理瓶颈都不一样。




A8是AMD的一款APU(集成了显卡)。   

说的有道理,因为现在生产环境还在弄,测试遇到了问题,看看能不能解决。毕竟,正式环境中有可能出现这个问题。

#24


先结贴。 感谢各位的回复。。

等放服务器上看效果怎么样。或许就没有这样的问题了。 

#1


更新如何来不及,数据库肯定不会提示你来不及更新

#2


恩。 就是速度有点慢。  

#3


进行100次交互(递交 UPDATE 语句)的花费通常比数据库正真进行更新动作的花费要慢。
建议改用 表值参数 (ADO.NET),这样只需要交互一次就能把100条语句一次性更新。

#4


多条update语句?就是你update 100条数据你就执行了100次update ?
这样的话你就可以要么选择用xml 做参数或者用datatable 做参数使用存储过程来批量更新,这样应该效率会高一点

#5


引用 3 楼 Tiger_Zhao 的回复:
进行100次交互(递交 UPDATE 语句)的花费通常比数据库正真进行更新动作的花费要慢。
建议改用 表值参数 (ADO.NET),这样只需要交互一次就能把100条语句一次性更新。





这个是个思路,  得学习一下 表值参数的知识。

#6


引用 4 楼 KanzakiOrange 的回复:
多条update语句?就是你update 100条数据你就执行了100次update ?
这样的话你就可以要么选择用xml 做参数或者用datatable 做参数使用存储过程来批量更新,这样应该效率会高一点




是的,就是100条update 语句,一次执行。
SqlDataAdapter  好像可以直接更新datatable, 但是不知道效率会怎么样。

#7


检查下执行计划,是否通过非聚集索引去更新的。另外检查下表有多少非聚集索引,聚集索引在什么字段上。
update的不仅仅是更新自己的数据,还会影响聚集索引,非聚集索引的内容

#8


引用 7 楼 wstoneh01 的回复:
检查下执行计划,是否通过非聚集索引去更新的。另外检查下表有多少非聚集索引,聚集索引在什么字段上。
update的不仅仅是更新自己的数据,还会影响聚集索引,非聚集索引的内容



是根据主key进行更新的。  其他非聚集索引是几个int型和numeric型字段。  

#9


方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况

#10


更新是否用的索引,比较重要

#11


引用 9 楼 wstoneh01 的回复:
方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

#12


引用 11 楼 denshanzhe 的回复:
Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#

#13


引用 12 楼 wstoneh01 的回复:
Quote: 引用 11 楼 denshanzhe 的回复:

Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#



实在是抱歉, 语句也没有, 都是程序跑起来生成的,现在也没有环境。   而更新  语句 其实是根据ID,更新全字段。 这些字段包含,int型,numeric型,time型,还有较多的nvarchar型。。 这个类型对更新有影响么?   


#14


引用 13 楼 denshanzhe 的回复:
Quote: 引用 12 楼 wstoneh01 的回复:

Quote: 引用 11 楼 denshanzhe 的回复:

Quote: 引用 9 楼 wstoneh01 的回复:

方便给出表结构,和update 1次即100条记录的实际执行计划么。
另外用sp_helpindex 贴一下索引情况




表结构现在拿不到。  关于索引,即使只用一个ID (int 型)  聚集索引。 速度也是100条大概0.4秒。

执行计划的话, 我是这样的: 拼接100条update语句,然后调用:
   SqlCommand sqlCom = new SqlCommand(strSQL, sqlCon_price);
                    sqlCom.CommandTimeout = 3000;
                    sqlCom.CommandType = CommandType.Text;
                    sqlCom.ExecuteNonQuery();
 执行这100条update语句的。

你理解错了,我是想看update的语句,SQL server的实际执行计划,不是c#



实在是抱歉, 语句也没有, 都是程序跑起来生成的,现在也没有环境。   而更新  语句 其实是根据ID,更新全字段。 这些字段包含,int型,numeric型,time型,还有较多的nvarchar型。。 这个类型对更新有影响么?   



通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。

#15


让数据库管理员,抓一下sql profiler,看一下实际运行情况。

#16


引用
通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。



因为这些是我家里的电脑上跑的效果,我现在回了老家,拿不到具体的数据。 

不过你说的也有道理,可能我电脑只能达到这个速度了。 而我是想看能不能再优化一下。 我自己的电脑就是普通台式机,cpu是A8的。 数据有1千万多一点。现在是测试,感觉速度有点慢。

那 请教一下,对于这样的大的数据,怎么能更新的更快呢?  而且是一台电脑, 我现在update的时候,进行查询的话 ,update就卡住了。 这个要怎么解决呢? 十分感谢。

#17


可以考虑脏读,select *from a with(nolock)

#18


单语法update视图的效率会比update表好,update大表有聚集索引的效率好,果然是主键更新,那么非聚集索引要少。

#19


建议按可控的规则(如全国数据按省份分)将表拆分为多个小表,增加数据并发性!

#20


引用 17 楼 wstoneh01 的回复:
可以考虑脏读,select *from a with(nolock)



即使用with(nolock),好像还是会卡的 。   我计划再弄个表,更新的时候直接插入,然后用存储过程来同步2个表。

#21


引用 19 楼 cxmcxm 的回复:
建议按可控的规则(如全国数据按省份分)将表拆分为多个小表,增加数据并发性!


已经做过查分。但是有个表有1千多万数据。 再拆就比较困难了。

#22


引用 16 楼 denshanzhe 的回复:
引用
通过查看sql server的实际执行计划就准确能定位是sql的问题,还是c#程序的问题,或者索引缺失的问题。另外服务器的IO或者其他因素。简单说,要分析的东西太多。我只能给你一个思路。根据你的描述,只能说达不到你的预期效果,至于是否真的慢,要对比。



因为这些是我家里的电脑上跑的效果,我现在回了老家,拿不到具体的数据。 

不过你说的也有道理,可能我电脑只能达到这个速度了。 而我是想看能不能再优化一下。 我自己的电脑就是普通台式机,cpu是A8的。 数据有1千万多一点。现在是测试,感觉速度有点慢。

那 请教一下,对于这样的大的数据,怎么能更新的更快呢?  而且是一台电脑, 我现在update的时候,进行查询的话 ,update就卡住了。 这个要怎么解决呢? 十分感谢。

A8 是什么cpu?
如果测试环境与生产不一致,调试效率是没用的。不同的硬件性能不同的设置数据库的处理瓶颈都不一样。

#23



A8 是什么cpu?
如果测试环境与生产不一致,调试效率是没用的。不同的硬件性能不同的设置数据库的处理瓶颈都不一样。




A8是AMD的一款APU(集成了显卡)。   

说的有道理,因为现在生产环境还在弄,测试遇到了问题,看看能不能解决。毕竟,正式环境中有可能出现这个问题。

#24


先结贴。 感谢各位的回复。。

等放服务器上看效果怎么样。或许就没有这样的问题了。