C#怎么处理大数据

沫林 2019-03-21 11:03:45
在postgresql 中有一张表,表里有五十几个字段,总共大概有六百多万条数据,甲方要给这张表的每个字段进行求合,如果直接把select sum(字段1) from tab写在for循环里的话,会出现ui线程会直接卡死,我现在的做法是开了两条子线程去求合,但是效果不理想,CLR会报错,而且某条SQL语句求和的结果是null但是直接放到数据库中是有结果的。所以问问有没有什么办法或者是技术可以很快速的求合
...全文
1706 37 点赞 打赏 收藏 举报
写回复
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
沫林 2019-03-25
引用 16 楼 還是 的回复:
先让ui线程不卡死,再获取1W条数据的sum,再10W。饭要一口一口吃

你是说开一条子线程,子线程先算一万条,然后再算一万条,直到把所有的数据算完后把结果反馈给主线程?
  • 打赏
  • 举报
回复
沫林 2019-03-25
引用 6 楼 LCL_data 的回复:
1)放到子线程去求和
2)针对表进行优化,比如加索引
3)优化你的查询脚本

子线程加了,还是慢 ,因为我这个没有where条件,所以加索引感觉用处不大,然后脚本该怎么优化呢?
  • 打赏
  • 举报
回复
沫林 2019-03-25
引用 18 楼 以专业开发人员为伍 的回复:
[quote=引用 11 楼 沫林 的回复:]
[quote=引用 10 楼 baidu_27549073的回复:][quote=引用 9 楼 沫林 的回复:]
循环数据表的列名
循环体里写的是每一列的求和sql语句

不用循环,拼接SQL语句,然后向下面这样查还卡吗?

select sum(字段1) as field1,sum(字段2) as field2 from tab

[/quote]
不行,有的列的字段并不是全是数字,求和的时候会抛异常的[/quote]

在一个“for循环里”写 select 语句会,而正确地产生一条 select 语句(然后仅仅执行一次这个语句)就不会?[/quote]
我先在数据库里用“cast"转了一下,能转成double的就算出结果,转不了的,就在try-catch的catch里直接赋成0,
我开线程只是想让它算的快点儿,主线程是一定要卡死的,不然界面都出来了求合的结果还在计算那肯定是不行的。
  • 打赏
  • 举报
回复
这根本就不是一个满脑子只有增删改查sql语句的人能理解的问题。
  • 打赏
  • 举报
回复
吉普赛的歌 2019-03-25
  • 打赏
  • 举报
回复
還是 2019-03-25
引用 38 楼 沫林 的回复:
[quote=引用 16 楼 還是 的回复:] 先让ui线程不卡死,再获取1W条数据的sum,再10W。饭要一口一口吃
你是说开一条子线程,子线程先算一万条,然后再算一万条,直到把所有的数据算完后把结果反馈给主线程?[/quote] int CalcSum(int nCount,int nStart) 我的意思是,先实现获取nCount = 1W,让程序功能正常实现。 再在这个基础上,实现nCount = 10W/100w,这样后面的1000w只是开几个线程的问题而已。
  • 打赏
  • 举报
回复
weixin_44496604 2019-03-24
感觉600w不多鸭
  • 打赏
  • 举报
回复
那为什么不在平时就将分散的数据进行以年/月/周/日的报表的形式存储下来,到时查询数据时不是更快一点?
  • 打赏
  • 举报
回复
Makerl0wang 2019-03-24
大数据都用数据库作为存储,一般是 nosql 数据库,使用对应的 api 获取数据再分析不就得了
  • 打赏
  • 举报
回复
Makerl0wang 2019-03-24
大数据都用数据库作为存储,一般是 nosql 数据库,使用对应的 api 获取数据再分析不就得了
  • 打赏
  • 举报
回复
Makerl0wang 2019-03-24
大数据都用数据库作为存储,一般是 nosql 数据库,使用对应的 api 获取数据再分析不就得了
  • 打赏
  • 举报
回复
一个数据库查询如果只用几十毫秒,而且多用户并发时并不怎么进行事务阻塞,那么你可以说纠结点“线程”名词儿。 否则,还是深入一点数据库编程经验,而不要想当然。
  • 打赏
  • 举报
回复
引用 24 楼 pstrunner 的回复:
[quote=引用 16 楼 還是 的回复:] 先让ui线程不卡死,再获取1W条数据的sum,再10W。饭要一口一口吃
我觉得这位仁兄说得在理,目前你的问题是因为UI卡死,而不是要求快速求和的问题。 再快的机器,在海量数据面前,还是显得微不足道。所以要“化整为零”,分阶段、分批次求和。 如果为了用户体验,可以设计一个进度条等效果,提示用户正在处理和进度。[/quote] 用个线程就不让“整个机器都卡死”了?lz 说的所谓“我现在的做法是开了两条子线程去求合”这样的话,已经说明了空谈线程的天花板就在于此。
  • 打赏
  • 举报
回复
引用 30 楼 Makerl0wang 的回复:
大数据都用数据库作为存储,一般是 nosql 数据库,使用对应的 api 获取数据再分析不就得了
nosql “对应的api”对大量数据记录的很多字段进行 sum 简单统计,通常并不会改进什么。
  • 打赏
  • 举报
回复
引用 楼主 沫林 的回复:
所以问问有没有什么办法或者是技术可以很快速的求合
从一个软件产品的系统设计上来说,满脑子只有增删改查的人,一点都没有业务经验,不知道类似“库存日记账”(以及其它几百种日记账)的类似道理,那么在数据处理方面也就只有百分之一的设计结果。以为软件不论什么分析查询报表都是写个统计 select 语句。
  • 打赏
  • 举报
回复
cmime 2019-03-23
大学学过,早还给老师了
  • 打赏
  • 举报
回复
用存储过程啊
  • 打赏
  • 举报
回复
另外,数据库是性能杀手,刚入门的人才满脑子只有数据库增删改查表面概念、而没有细节。比如说会计随时可能要查询商品成本,人家看的是商品库存日记账中的记录,而不是搞什么统计,这就是人家的技术所在。所以你们的所谓“大数据”查询,可能本身就是不切实际地乱想。
  • 打赏
  • 举报
回复
引用 11 楼 沫林 的回复:
[quote=引用 10 楼 baidu_27549073的回复:][quote=引用 9 楼 沫林 的回复:] 循环数据表的列名 循环体里写的是每一列的求和sql语句
不用循环,拼接SQL语句,然后向下面这样查还卡吗?

select sum(字段1) as field1,sum(字段2) as field2 from tab
[/quote] 不行,有的列的字段并不是全是数字,求和的时候会抛异常的[/quote] 在一个“for循环里”写 select 语句会,而正确地产生一条 select 语句(然后仅仅执行一次这个语句)就不会?
  • 打赏
  • 举报
回复
引用 楼主 沫林 的回复:
在postgresql 中有一张表,表里有五十几个字段,总共大概有六百多万条数据,甲方要给这张表的每个字段进行求合,如果直接把select sum(字段1) from tab写在for循环里的话,会出现ui线程会直接卡死,我现在的做法是开了两条子线程去求合,但是效果不理想,CLR会报错,而且某条SQL语句求和的结果是null但是直接放到数据库中是有结果的。所以问问有没有什么办法或者是技术可以很快速的求合
没看懂。 select sum(字段) from tab 这样的 sql 语句只要执行一次就行了,为什么要写到 for 循环里?
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2019-03-21 11:03
社区公告

让您成为最强悍的C#开发者