import into语句使用场景和用法

【 TiDB 使用环境】测试
【 TiDB 版本】7.5.0
【复现路径】在sql客户端工具中使用import into导入数据
【遇到的问题:问题现象及影响】
我有个场景需要从A表(千万),通过一定条件查询把结果写入B表(几十万),我想使用import into来完成这个操作。目前有两个问题:

  1. 这个场景是否适合import into来操作
  2. 我在客户端工具(datagrip 命令行)中都使用过 import into tableA from select * from tableB where xxx,一执行就会报错Statement.executeQuery() cannot issue statements that ,想请问下这个命令是不支持在客户端发起使用么?

import into 用于将 CSVSQLPARQUET 等格式的数据导入到 TiDB 的一张空表中。不支持你这种直接select一段数据。
你需要先导出数据成csv或者sql,才能用import into导入指定表。

2 个赞

使用dumpling导出,lightning导入
8版本才支持select

1 个赞

直接insert into 不行吗? 数据也不大啊

batch on应该可以满足吧https://docs.pingcap.com/zh/tidb/stable/sql-statement-batch#batch

几十万用insert into select不靠谱,一个容易超出事务大小,另一个容易OOM,我们之前试过在字段多一点的情况下不超过10万都OOM过。

之前我们也遇到过不少楼主描述的场景,楼上说的两种方式都可以的,我们也使用过:
(1)使用dumpling导出,lightning导入;(写入数据量大、查询逻辑复杂和追求效率,推荐这种方式)
(2)非事务DML,batch on …;(写入数据量小、查询逻辑简单和分页数少,可以使用这种)

十几万记录就不行了啊

主要看字段多少和字段类型,像decimal这种字段类型在使用过程中会产生放大

当前还不行, 一、IMPORT INTO 只支持导入空表中;二、IMPORT INTO SELECT的语法在7.5 还不支持,是8.1才支持的。

7.5的场景,可以试下上面提的 BATCH ON语法

都在数据库里面,可以考虑使用INSERT INTO tableA
SELECT *
FROM tableB
WHERE xxx;

这好像也没多少数据量嘛,不行就insert into select 分批导入

insert into应该可以,但得控制批次、每批次提交多少行。

使用IMPORT INTO命令的目的:一是为了突破事务大小限制,二是为了提升插入效率,三是减少程序代码改造量,业务上主要是用于日结、月结表的数据归档。(batch on相较于import into还是太慢了)
业务系统由Oracle数据库适配改造为TiDB数据库的过程中,有了IMPORT INTO命令,就不用单独开发代码在操作系统级调用lightning,可以直接修改原始insert into语句为import into语句。
ps:Oracle作为集中式数据库,数据归档的时候十几个g的事务很常见,目前TiCDC的单事务大小仍然有限制,如果强行调整TiDB服务端的事务大小,有可能破坏数据回退和备份。

先导中间表(库),再分批小事务导入到正式表

这个解释比较详细,靠谱

7.5版本不支持select,v8.1版本支持,可以查看官方文档: IMPORT INTO | PingCAP 文档中心

你得先升级到tidb8以上版本,可以用import imto 替代insert into