有没有处理过单表2亿条数据,33个字段(无大数据字段 text,blob之类的),要求:一个 select-from返回全表数据的

2亿条数据都用吗,技术上来说不管是什么数据库,到这个数据量级都不会很快,建议确认用数据要做的目的事情是什么。

这是个业务问题,不是数据库问题。

1 个赞

tidb_mem_quota_query设置大一些,关于一条出,这不就是展示逻辑的问题了吗?

这个问题我要是dba能喷到研发半年,你取这么多数据谁看

实际上顶多分页,而且去按条件分页

喷研发干啥啊,人家是datax同步数据,跟研发有啥关系哦

噢噢噢噢,没注意看[quote=“forever, post:28, topic:1019908, full:true”]
喷研发干啥啊,人家是datax同步数据,跟研发有啥关系哦
[/quote]

不管什么数据库,这种级别的数据量全量读取都是流式读取,数据从内存过一遍,不需要全部加载到内存

流式读,这个参数必须这样设置,statement.setFetchSize(Integer.MIN_VALUE) , 这个特征和mysql保持一致。 流式几乎不占用内存。

读不是问题,问题是读完之后,写怎么办? :see_no_evil:

不建议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 中