2亿条数据都用吗,技术上来说不管是什么数据库,到这个数据量级都不会很快,建议确认用数据要做的目的事情是什么。
这是个业务问题,不是数据库问题。
tidb_mem_quota_query设置大一些,关于一条出,这不就是展示逻辑的问题了吗?
这个问题我要是dba能喷到研发半年,你取这么多数据谁看
实际上顶多分页,而且去按条件分页
喷研发干啥啊,人家是datax同步数据,跟研发有啥关系哦
噢噢噢噢,没注意看[quote=“forever, post:28, topic:1019908, full:true”]
喷研发干啥啊,人家是datax同步数据,跟研发有啥关系哦
[/quote]
不管什么数据库,这种级别的数据量全量读取都是流式读取,数据从内存过一遍,不需要全部加载到内存
流式读,这个参数必须这样设置,statement.setFetchSize(Integer.MIN_VALUE) , 这个特征和mysql保持一致。 流式几乎不占用内存。
读不是问题,问题是读完之后,写怎么办?
不建议select*不加条件;建议分页,另外并发的时候建议调小底层并发和数据读取速度。
配合流式读取,作如下读取速度限制,
限制fullscan&index速度:
以下是在java中的示例,com.adata.common.tidb.read.是java包类名:
com.adata.common.tidb.read.tidb_distsql_scan_concurrency=1; --15
com.adata.common.tidb.read.tidb_init_chunk_size=8; --32
com.adata.common.tidb.read.tidb_max_chunk_size=32; --128
com.adata.common.tidb.read.tidb_executor_concurrency=1; --5
限制index读取速度:
com.adata.common.tidb.read.tidb_index_lookup_size=20; --2000
com.adata.common.tidb.read.tidb_index_serial_scan_concurrency=1; --1
流式读数限制Tiflash读取速度在当前session的代码设置:set @@tidb_max_tiflash_threads=3; --“-1”
另外限制客户端读取速度:配合连接字符串cursorfetch=true,java代码设置setfetchsize(1000);
分页是另一个控制OOM的选项,一个选择但是用户侧目前为了通用性,不方便分页。
————————————————
原文链接:tidb流式读取配置-CSDN博客
一边读一边落盘啊, 以自己的方式落到到磁盘上,通过外部排序等方式组织数据进行后续处理。 当然如果内存足够大,也行
datax 自带并发,控制一下并发,别一下全量
如果是同步的话可以用kettle进行抽取,或者是数据导出导入的方式,一次查询出来2亿条数据,建议你把这台服务器的所有内存都给了,设置会话级别的参数先试试,还得是不影响业务的情况下
可以扩大下tidb_mem_quota_query的参数
一个SQL查2亿条数据,想不到为啥要这么干,是想测试极限么
一次性同步到 oracle 中