gx19860411 发表于 2023-10-28 10:06

有什么往SQL server里导数据比较快的方法么?

有个csv需要往SQL server里导,用自带的导入向导,即使已经有空表了,还要设置字段类型,然而对方给的是mysql里的字段信息,好多数据类型SQL server里找不到,并且总会出现截断错误,长度改来改去很是恼火。
用navicat设置很方便,但是太慢了,14个小时才导了几十万条。库和源文件都在本地。
求问有没有既方便又快速的导入方法呢?

すぴぱら 发表于 2023-10-28 10:12

安产型美羽 发表于 2023-10-28 10:15

先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试

MRhythm 发表于 2023-10-28 11:05

navicat慢是因为这玩意默认开事务+自动提交, 导入一条commit一条, 大量I/O操作肯定慢

导入的时候把auto commit关了再试试, 速度能提高个几百倍.

当然代价就是失败了全部回滚.

gx19860411 发表于 2023-10-28 12:43

安产型美羽 发表于 2023-10-28 10:15
先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试 ...

嗯,这次直接把所有字段导成ntext进全新的表,速度快了五六倍

—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4

gx19860411 发表于 2023-10-28 12:46

MRhythm 发表于 2023-10-28 11:05
navicat慢是因为这玩意默认开事务+自动提交, 导入一条commit一条, 大量I/O操作肯定慢

导入的时候把auto co ...

“失败”的意思是导入中有错误条目还是其他情况呢?

—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4

gx19860411 发表于 2023-11-2 11:23

更新下,几天了才导了不到五千万条,一看navicat只有时间在走,已处理和已添加条数卡住不动了…错误是0

—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4

alvin051414 发表于 2023-11-2 11:39

sql server应该可以bulk insert……

hgfdsa 发表于 2023-11-2 11:59

navicat生成表结构,写个脚本把csv转换成批量插入的sql语句

帆影FX 发表于 2023-11-2 12:22

找个etl工具,比如kettle?

白木亚绘香 发表于 2023-11-2 12:33

sql server官方就有bcp可以用来bulk insert,这个是最快的:https://learn.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver16
python也有包能调用bcp,我上传2亿条花了20多分钟https://pypi.org/project/bcpandas/

白木亚绘香 发表于 2023-11-2 12:40

上面忘了说是拿python同时跑了多个进程上传才20多分钟传了2亿行的……

紧那罗 发表于 2023-11-2 19:07

要保证事务就会慢,记事务还逐条commit就更慢了。
通用的做法 批量insert or一条insert插多行数据
或者关掉日志(这条好像sql server没法用)

这些是基于使用通用sql的前提,用数据库自带的导入工具一般还能再快一点,比如上面提到的bcp

gx19860411 发表于 2023-11-2 20:34

谢楼上诸位。先去看了一眼bcp,发现是命令行,就去试了kettle。可视化界面挺讨喜的,但导入时需要设定字段长度,发现有一个长字段我竟然不知道具体最长长度。对方给的sql文件应该是MySQL的,这个字段类型是longtext,于是,然后看到navicat又开始动了,就暂时没试其他的了。
话说几年下来零零星星使用SQL server感觉尤其是导入是真的不方便,朋友多次给推荐MySQL,怎奈语录不熟(应该不通用吧?)就没换阵营。
要不要下决心转MySQL呢?

—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4

alvin051414 发表于 2023-11-2 21:47

本帖最后由 alvin051414 于 2023-11-2 21:49 编辑

longtext大概2^32,一般在sql server里用text或者ntext凑合存呗

kenqqex 发表于 2023-11-3 09:47

gx19860411 发表于 2023-11-2 20:34
谢楼上诸位。先去看了一眼bcp,发现是命令行,就去试了kettle。可视化界面挺讨喜的,但导入时需要设定字段 ...

转了吧,长痛不如短痛

bapijun1 发表于 2023-11-3 10:18

gx19860411 发表于 2023-11-3 11:17

alvin051414 发表于 2023-11-2 21:47
longtext大概2^32,一般在sql server里用text或者ntext凑合存呗

试了,都报错

—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4

viruswho 发表于 2023-11-3 15:41

我的做法是用自带的导入向导,每次都导入新表比方叫 csv20231111,列名无所谓,所有列均可空,不能可靠确定类型的都用 ntext.

导入完成后,手写
-- insert into xxx (c1, c2)
select cast(a1, int) as c1, ....
from csv20231111
先执行一遍看看数据正确性,然后带insert 执行插入
页: [1]
查看完整版本: 有什么往SQL server里导数据比较快的方法么?