【 TiDB 使用环境】测试
【 TiDB 版本】7.5.0
【复现路径】在sql客户端工具中使用import into导入数据
【遇到的问题:问题现象及影响】
我有个场景需要从A表(千万),通过一定条件查询把结果写入B表(几十万),我想使用import into来完成这个操作。目前有两个问题:
这个场景是否适合import into来操作
我在客户端工具(datagrip 命令行)中都使用过 import into tableA from select * from tableB where xxx
,一执行就会报错Statement.executeQuery() cannot issue statements that ,想请问下这个命令是不支持在客户端发起使用么?
import into 用于将 CSV
、SQL
、PARQUET
等格式的数据导入到 TiDB 的一张空表中。不支持你这种直接select一段数据。
你需要先导出数据成csv或者sql,才能用import into导入指定表。
2 个赞
使用dumpling导出,lightning导入
8版本才支持select
1 个赞
懒云一笑
2024 年9 月 7 日 10:40
4
直接insert into 不行吗? 数据也不大啊
几十万用insert into select不靠谱,一个容易超出事务大小,另一个容易OOM,我们之前试过在字段多一点的情况下不超过10万都OOM过。
之前我们也遇到过不少楼主描述的场景,楼上说的两种方式都可以的,我们也使用过:
(1)使用dumpling导出,lightning导入;(写入数据量大、查询逻辑复杂和追求效率,推荐这种方式)
(2)非事务DML,batch on …;(写入数据量小、查询逻辑简单和分页数少,可以使用这种)
主要看字段多少和字段类型,像decimal这种字段类型在使用过程中会产生放大
dba-kit
(张天师)
2024 年9 月 8 日 11:05
10
当前还不行, 一、IMPORT INTO 只支持导入空表中;二、IMPORT INTO SELECT的语法在7.5 还不支持,是8.1才支持的。
7.5的场景,可以试下上面提的 BATCH ON语法
迷途小书童
2024 年9 月 9 日 00:35
11
都在数据库里面,可以考虑使用INSERT INTO tableA
SELECT *
FROM tableB
WHERE xxx;
这好像也没多少数据量嘛,不行就insert into select 分批导入
TiDBer_刚
(Ti D Ber Q1w65d Av)
2024 年9 月 9 日 00:52
13
insert into应该可以,但得控制批次、每批次提交多少行。
yg_2024
(yangguang)
2024 年9 月 9 日 00:56
14
使用IMPORT INTO命令的目的:一是为了突破事务大小限制,二是为了提升插入效率,三是减少程序代码改造量,业务上主要是用于日结、月结表的数据归档。(batch on相较于import into还是太慢了)
业务系统由Oracle数据库适配改造为TiDB数据库的过程中,有了IMPORT INTO命令,就不用单独开发代码在操作系统级调用lightning,可以直接修改原始insert into语句为import into语句。
ps:Oracle作为集中式数据库,数据归档的时候十几个g的事务很常见,目前TiCDC的单事务大小仍然有限制,如果强行调整TiDB服务端的事务大小,有可能破坏数据回退和备份。
kevinsna
(Ti D Ber P O Zcnp Ja)
2024 年9 月 10 日 04:42
17
7.5版本不支持select,v8.1版本支持,可以查看官方文档: IMPORT INTO | PingCAP 文档中心
zhanggame1
(Ti D Ber G I13ecx U)
2024 年9 月 10 日 06:01
18
你得先升级到tidb8以上版本,可以用import imto 替代insert into