|PostgreSQL中数据批量导入优化方法( 二 )


建议在批量导入数据之前禁用目标表中的所有触发器 , 并在导入完成后再启用它们 。 禁用所有触发器也会强制执行外键约束检查的系统触发器 。
ALTER TABLE <target table> DISABLE TRIGGER ALL
<批量导入数据…>
ALTER TABLE <target table> ENABLE TRIGGER ALL
使用多值INSERT
对于成批数据加载 , 运行数千个或数十万个INSERT语句可能是个糟糕的选择 。 因为查询优化器必须解析和准备每个单独的INSERT命令 , 然后进行所有约束检查 , 作为单独的事务运行并记录日志 。 而使用多值单个INSERT语句可以节省这些不必要的开支 。
INSERT INTO(, , …, ) VALUES (, , …, ), (, , …, ), (, , …, ), (, , …, ), ...
多值INSERT性能受现有索引的影响 。 建议在运行命令之前先删除索引 , 然后再创建索引 。
另一个需要注意的地方是PostgreSQL可用于运行多值INSERT的内存量 。 运行多值INSERT时 , RAM中必须容纳大量输入值 , 并且除非有足够的可用内存 , 否则该过程可能会失败 。
建议将设置effective_cache_size参数到50% , 并将shared_buffer设为机器的总内存的参数设为25% 。 为了安全起见 , 将导入划分为多条的多值INSERT , 每个语句的值不要超过1000行 。
使用COPY命令
建议使用PostgreSQL COPY命令从一个或多个文件导入数据 。 COPY针对批量数据导入会进行额外的优化 , 比运行大量INSERT语句甚至多值INSERTS的都要快 。
COPY[( column1>, … , )] FROM '' WITH (, , … , )
使用COPY的还有很多的优势:
它支持文本和二进制文件导入;
本质上是事务性的;
它允许指定输入文件的结构;
它可以使用WHERE子句有条件地导入数据 。
运行ANALYZ
这与提高批量数据导入性能无关 , 但是强烈建议在批量导入之后立即在目标表上运行ANALYZE命令 。 大量的新导入的行将大大改变数据表中列中的数据分布 , 并且会使表的统计信息都过时 。 当用查询优化器使用过时的统计信息时 , 查询性能可能会非常慢 。 运行ANALYZE命令将确保更新统计信息 。
|PostgreSQL中数据批量导入优化方法
本文插图

总结
【|PostgreSQL中数据批量导入优化方法】对于数据库应用程序来说 , 可能并非每天都会进行批量数据导入 , 但是在运行时会对查询性能产生影响 。 这就是为什么有必要尽可能缩短导入时间 。 DBA可以最大程度地减少意外的事情之一就是在具有类似服务器规格和PostgreSQL配置的开发或准线上环境中进行性能测试并进行优化 。 每种数据加载方案都是不同的 , 最好尝试每种方法并找到最好最快的方法 。


推荐阅读