对于大量数据的批量导入(bulk insert),使用专门的命令和工具:BULK INSERT、COPY、LOAD DATA INFILE,以及外部工具如bcp(SQL Server)、psql(PostgreSQL)和ETL工具。
PostgreSQL示例:
COPY staging_table (id, name, age) FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER; -- 数据检查,在验证后转移到生产表 INSERT INTO prod_table (id, name, age) SELECT id, name, age FROM staging_table WHERE age >= 0 AND name IS NOT NULL;
问题: 为什么在对大型带有索引的表进行批量插入后,后续操作的性能会急剧下降?
回答: 因为批量插入直接填充表,而索引只有在主要导入完成后才会重新创建/更新,这可能会锁定表并消耗资源。建议在导入时禁用辅助索引,并在结束后重新创建,或者分批进行。
经验教训
在一个物流项目中,通过BULK INSERT直接批量导入数百万行,没有使用临时表——无效数据“堵塞”了索引无效信息,导致由于外键和检查约束不能简单“回滚”部分坏行。数据不得不手动清理。
经验教训
在一个企业服务中,批量插入将导入时间提高了10倍,因为在填充期间没有禁用辅助索引,并且在每一步都重新计算了它们的结构。
经验教训
在一个金融科技产品中,在加载大文件时,批量插入因为silent错误未能加载所有行,因为错误代码未被正确处理——我们失去了部分重要信息,几天后通过与外部来源对比才发现。