有什么往SQL server里导数据比较快的方法么?
有个csv需要往SQL server里导,用自带的导入向导,即使已经有空表了,还要设置字段类型,然而对方给的是mysql里的字段信息,好多数据类型SQL server里找不到,并且总会出现截断错误,长度改来改去很是恼火。用navicat设置很方便,但是太慢了,14个小时才导了几十万条。库和源文件都在本地。
求问有没有既方便又快速的导入方法呢? 找个orm库,解析好csv 然后往里面灌数据? 先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试 navicat慢是因为这玩意默认开事务+自动提交, 导入一条commit一条, 大量I/O操作肯定慢
导入的时候把auto commit关了再试试, 速度能提高个几百倍.
当然代价就是失败了全部回滚. 安产型美羽 发表于 2023-10-28 10:15
先不做任何约束,字段数目对上即可,等导入完成后,再修改字段属性、主键、索引这些试试 ...
嗯,这次直接把所有字段导成ntext进全新的表,速度快了五六倍
—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4 MRhythm 发表于 2023-10-28 11:05
navicat慢是因为这玩意默认开事务+自动提交, 导入一条commit一条, 大量I/O操作肯定慢
导入的时候把auto co ...
“失败”的意思是导入中有错误条目还是其他情况呢?
—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4 更新下,几天了才导了不到五千万条,一看navicat只有时间在走,已处理和已添加条数卡住不动了…错误是0
—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4 sql server应该可以bulk insert…… navicat生成表结构,写个脚本把csv转换成批量插入的sql语句 找个etl工具,比如kettle? 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/
上面忘了说是拿python同时跑了多个进程上传才20多分钟传了2亿行的…… 要保证事务就会慢,记事务还逐条commit就更慢了。
通用的做法 批量insert or一条insert插多行数据
或者关掉日志(这条好像sql server没法用)
这些是基于使用通用sql的前提,用数据库自带的导入工具一般还能再快一点,比如上面提到的bcp 谢楼上诸位。先去看了一眼bcp,发现是命令行,就去试了kettle。可视化界面挺讨喜的,但导入时需要设定字段长度,发现有一个长字段我竟然不知道具体最长长度。对方给的sql文件应该是MySQL的,这个字段类型是longtext,于是,然后看到navicat又开始动了,就暂时没试其他的了。
话说几年下来零零星星使用SQL server感觉尤其是导入是真的不方便,朋友多次给推荐MySQL,怎奈语录不熟(应该不通用吧?)就没换阵营。
要不要下决心转MySQL呢?
—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4 本帖最后由 alvin051414 于 2023-11-2 21:49 编辑
longtext大概2^32,一般在sql server里用text或者ntext凑合存呗 gx19860411 发表于 2023-11-2 20:34
谢楼上诸位。先去看了一眼bcp,发现是命令行,就去试了kettle。可视化界面挺讨喜的,但导入时需要设定字段 ...
转了吧,长痛不如短痛 alvin051414 发表于 2023-11-2 21:47
longtext大概2^32,一般在sql server里用text或者ntext凑合存呗
试了,都报错
—— 来自 Xiaomi M2011K2C, Android 13上的 S1Next-鹅版 v2.5.4 我的做法是用自带的导入向导,每次都导入新表比方叫 csv20231111,列名无所谓,所有列均可空,不能可靠确定类型的都用 ntext.
导入完成后,手写
-- insert into xxx (c1, c2)
select cast(a1, int) as c1, ....
from csv20231111
先执行一遍看看数据正确性,然后带insert 执行插入
页:
[1]