大批量数据查询卡死情况?

qq_34067000 2018-01-23 11:20:26
最近发现一个情况,当有人拉报表或查询大批量数据时,其他用户使用就会很卡。
这种情况各位大佬你们是怎么解决的?让我也学习学习。
...全文
1239 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
lz 所说的“其它用户很卡”,这基本上就是说的是数据库服务器CPU资源耗尽(比如说错误的逻辑设计、缺乏必要的索引等等)或者某些查询服务阻塞(比如说把需要并发多线程异步处理的部分却错误设计成了垃圾的“队列处理”)问题,不太涉及带宽用尽、甚至客户端UI部分阻塞问题。
newnazi 2018-01-25
  • 打赏
  • 举报
回复
楼主你没有把 问题说清楚, 卡死的 条件环境是怎样的 ??如何操作 ? 你这表达沟通能力才是硬伤吧
  • 打赏
  • 举报
回复
引用 17 楼 stevenjin 的回复:
还可以考虑存储过程呢
把应用端 sql 语句改为存储过程,其实这个方法最没用。其它许多方法都有点效果,可是看上去最“高大上”的存储过程说法其实反而没有什么有感觉的效果。
圣殿骑士18 2018-01-24
  • 打赏
  • 举报
回复
你需要一定的DBA的能力
xiaoxiangqing 2018-01-24
  • 打赏
  • 举报
回复
每次查询只返回少量的数据,分多次返回
stevenjin 2018-01-24
  • 打赏
  • 举报
回复
还可以考虑存储过程呢
小灰狼 2018-01-24
  • 打赏
  • 举报
回复
1、优化查询,这里学问蛮多的,但也不难理解,可以自己问度娘 2、定期进行归档,对需要经常进行汇总性查询的数据,分析一下共性,把汇总和统计的中间结果进行周期性归档,以后在报表中查归档表,这样数据量会少很多 3、数据库冗余,一个是正常业务数据库(OLTP,联机在线事务处理),一个是分析数据库(OLAP,联机在线分析),使用一种机制使分析数据库向业务数据库保持同步,在进行业务处理时(insert, update, delete)访问业务数据库,在进行报表分析时,访问分析数据库
weixin_39168334 2018-01-24
  • 打赏
  • 举报
回复
开个Task去查询,查到后回到UI线程显示呗。
qq_25359745 2018-01-24
  • 打赏
  • 举报
回复
大概是这样 Task.Factory.StartNew(() => { //查询 }).GetAwaiter().OnCompleted(() => { //显示 });
qq_25359745 2018-01-24
  • 打赏
  • 举报
回复
开个Task去查询,查到后回到UI线程显示。
正怒月神 2018-01-23
  • 打赏
  • 举报
回复
winth no lock 查询。
yaotomo 2018-01-23
  • 打赏
  • 举报
回复
1、数据表加索引 2、分页查询 3、使用多线程
  • 打赏
  • 举报
回复
简单点说,你不管有锁无锁的时候,更新和插入必须等查询完成(更新是行锁,因此查询没有落在那一行的时候可以不用等待,而插入的排他锁只要你有任意锁就必须等待解锁。 因此在大的查询加无锁脏读数据是很常见的做法,这样做可以使这种大型并不要求高精度的查询不去锁表,从而加快其他操作的速度。 另外共享锁的过程中其他共享锁不互斥。
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 5 楼 qq_34067000 的回复:] [quote=引用 4 楼 jhy593443 的回复:] 查询语句最好加上 select ID,UserID,....from Tab with(nolock) where ...... 还有建立好合适的索引 数据量大的话建议分区、分片
如果解锁会有什么影响没?[/quote] 这读取的是脏数据,当然这并保证数据绝对一致。这样直接读取数据快照的目的是为了速度快一点。[/quote] 不仅仅,常见数据库锁有共享锁、更新锁(行锁)、排他锁。 查询锁是共享锁。 所以当有巨大的查询,有有更新刚好要更新到这个查询内某条数据(行锁)时候,更新需要等待查询完成,无锁的时候就不需要等待。插入是排他锁,同理。
  • 打赏
  • 举报
回复
当然这并保证数据绝对一致 --> 当然这并不保证数据绝对一致 简单说,就是你要测试每一次查询事务的速度。如果保证在1秒钟之内,那么就可以。如果时间很长,那么就应该考虑把报表数据分为多个数据模块,每一个从前端出发去异步、并发查询拉取数据。
  • 打赏
  • 举报
回复
对于频繁反复查询的 sql,在服务器端应该有数据缓存(以每一个 sql 为缓存 key),这样可以阻挡对数据库的访问,将 System.Caching.Cache 系统中保存的数据直接发送给客户端。
  • 打赏
  • 举报
回复
引用 5 楼 qq_34067000 的回复:
[quote=引用 4 楼 jhy593443 的回复:] 查询语句最好加上 select ID,UserID,....from Tab with(nolock) where ...... 还有建立好合适的索引 数据量大的话建议分区、分片
如果解锁会有什么影响没?[/quote] 这读取的是脏数据,当然这并保证数据绝对一致。这样直接读取数据快照的目的是为了速度快一点。
qq_34067000 2018-01-23
  • 打赏
  • 举报
回复
引用 3 楼 zhuo_wp 的回复:
另外,如果是静态的统计结果,可以提前生成存表,而不要通过实时查询动态计算。 比如,你要知道一个月的总的数据量,那提前把这些数据放到数据库里,而不是查询的时候去查30天的数据然后计算。
就是说提前把这些报表都算好了,放在一个表里,用的时候提出来就可以了是吧。
qq_34067000 2018-01-23
  • 打赏
  • 举报
回复
引用 4 楼 jhy593443 的回复:
查询语句最好加上 select ID,UserID,....from Tab with(nolock) where ...... 还有建立好合适的索引 数据量大的话建议分区、分片
如果解锁会有什么影响没?
zhuowp 2018-01-23
  • 打赏
  • 举报
回复
另外,如果是静态的统计结果,可以提前生成存表,而不要通过实时查询动态计算。 比如,你要知道一个月的总的数据量,那提前把这些数据放到数据库里,而不是查询的时候去查30天的数据然后计算。
加载更多回复(5)
版本:presto-server-0.214.tar软件版本 presto-cli-0.214-executableCentOS71、presto的起因 hadoop ---hdfs----MR(java)-----hivehive底层原理用MR,速度比较慢,公司hadoop集群主要集中于晚上到凌晨,平日工作时间负载不是很高。但在工作时间内,公司业务人员有实时查询的需求,现在主要借助于hive提供业务人员的查询。hive是基于MR类的SQL查询工具,他会输入的查询SQL解析为MapReduce,能极大的降低使用大数据门槛,让一般的业务人员可以直接准对大数据进行查询,但是有一个利弊,它的查询基于MR,会让人等待比较着急,等待的时间可能是几个小时或者一天。 spark基于内存提高改良的hive,sql,现在factbook在hive上面开发一套利器,准对hive可以通过sql语句快速查询,presto。2、Facebook为何开发Presto  Facebook的2011的数据仓库存储在少量大型hadoopfs集群,Hive是FaceBook在几年前专门为Hadoop打造的一款数据仓库工具,在以前,facebook的科学家和分析师一直靠hive进行数据分析.但hive使用MR作为底层计算框架,是专为批处理设计的,但是随着数据的不断增多,使用hive进行一个简单的数据查询可能要花费分钟或者几个小时,显然不能满足查询需求,FaceBooke也调研了其他比hive更快的工具,但是他们需要在功能有限的条件下做简单操作,以至于无法操作Facebook庞大的数据要求。2012年开始研究自己的框架--presto,每日可以超过1pb查询,而且速度比较快,faceBook声称Presto的性能比hive要好上10倍或者100倍,presto和hive都是facebook开发的 Presto是一个开源的分布式SQL查询引擎,适用于交互式查询数据量支持GB到PB字节。Presto的设计和编写完全是为了解决Facebook这样规模的商业数据仓库交互式分析和处理速度的问题Presto可以做什么 Presto支持在线数据查询,包括Hive kafka Cassandra关系数据库以及专门数据存储,一条Presto查询可以将多个数据源进行合并,可以跨越整个组织进行分析。Presto以分析师的需求作为目标,他们期望相应速度小于1秒到几分钟,Presto要么在使用速度的快的昂贵的商业方案,提高内存,要么是消耗大量的硬件进行快速查询。(128G 64G)本套课程教给如何在企业环境中使用Presto技术。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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