找回密码
 立即注册
搜索
查看: 3532|回复: 18

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

[复制链接]
     
发表于 2023-10-28 10:06 来自手机 | 显示全部楼层 |阅读模式
有个csv需要往SQL server里导,用自带的导入向导,即使已经有空表了,还要设置字段类型,然而对方给的是mysql里的字段信息,好多数据类型SQL server里找不到,并且总会出现截断错误,长度改来改去很是恼火。
用navicat设置很方便,但是太慢了,14个小时才导了几十万条。库和源文件都在本地。
求问有没有既方便又快速的导入方法呢?
回复

使用道具 举报

头像被屏蔽
     
发表于 2023-10-28 10:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2023-10-28 10:15 | 显示全部楼层
先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试
回复

使用道具 举报

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

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

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

使用道具 举报

     
 楼主| 发表于 2023-10-28 12:43 来自手机 | 显示全部楼层
安产型美羽 发表于 2023-10-28 10:15
先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试 ...

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

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

使用道具 举报

     
 楼主| 发表于 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
回复

使用道具 举报

     
 楼主| 发表于 2023-11-2 11:23 来自手机 | 显示全部楼层
更新下,几天了才导了不到五千万条,一看navicat只有时间在走,已处理和已添加条数卡住不动了…错误是0

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

使用道具 举报

     
发表于 2023-11-2 11:39 来自手机 | 显示全部楼层
sql server应该可以bulk insert……
回复

使用道具 举报

发表于 2023-11-2 11:59 | 显示全部楼层
navicat生成表结构,写个脚本把csv转换成批量插入的sql语句
回复

使用道具 举报

     
发表于 2023-11-2 12:22 | 显示全部楼层
找个etl工具,比如kettle?
回复

使用道具 举报

     
发表于 2023-11-2 12:33 | 显示全部楼层
sql server官方就有bcp可以用来bulk insert,这个是最快的:https://learn.microsoft.com/en-u ... ew=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
回复

使用道具 举报

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

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

使用道具 举报

     
发表于 2023-11-2 21:47 来自手机 | 显示全部楼层
本帖最后由 alvin051414 于 2023-11-2 21:49 编辑

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

使用道具 举报

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

转了吧,长痛不如短痛
回复

使用道具 举报

头像被屏蔽
     
发表于 2023-11-3 10:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 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
回复

使用道具 举报

     
发表于 2023-11-3 15:41 | 显示全部楼层
我的做法是用自带的导入向导,每次都导入新表比方叫 csv20231111,列名无所谓,所有列均可空,不能可靠确定类型的都用 ntext.

导入完成后,手写
  1. -- insert into xxx (c1, c2)
  2. select cast(a1, int) as c1, ....
  3. from csv20231111
复制代码

先执行一遍看看数据正确性,然后带insert 执行插入
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-20 20:52 , Processed in 0.109282 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表