2017-07-04 26 views
4

我在做一个Python脚本的几个数据插入到PostgreSQL数据库。使用psycopg2删除索引在提交之前或之后生效?

为了加快加载过程我的脚本继PostgreSQL的documentation具有这种结构的

  • 连接到数据库,并创建一个光标
  • 删除所有索引
  • 加载所有数据使用“复制”命令
  • 重新创建回所有索引
  • 提交并关闭游标和连接(仅在整个脚本中提交)

所以我的问题是:在提交之前删除索引,在加速加载方面取得任何效果,或不是?

+0

您删除索引快速'COPY' - 它没有连接到前/后提交(对不起 - 我不明白的问题) –

+0

是的,它是在脚本的开始连接。要解决这个问题以避免误解 – donatorolo

回答

1

commit只是犯任何正在进行的正在进行中的事务到数据库。

你实际上在问什么,如果是否删除索引,然后在同一事务中复制将提供相同的加速在一个事务首先删除索引,然后在一个新的事务复制数据。

docs直接报价说:

如果要添加大量的数据到现有的表,这可能是一场胜利来删除索引,装载表,然后重新创建索引。 当然,在缺少索引期间,其他用户的数据库性能可能会受到影响。在删除唯一索引之前,还应该考虑两次,因为唯一约束所提供的错误检查将在索引丢失时丢失。

粗体部分间接告诉你应该在删除索引之后进行提交,因为没有提交(完成事务)的删除索引不应该对数据库的其他用户产生任何影响。

因此,解决办法应该是沿着这些路线的东西:

放下你的索引,提交,复制数据,创建新的索引并再次提交。

注意,当你分割你的交易为两项交易,你失去的原子。即您的索引可能会被删除,但是没有数据被复制(例如,在复制事务期间电源或网络丢失)并且索​​引不会被重新创建。

+1

我想说的是相反的。从报价你应该'开始;跌落指数;复制;重新创建索引;犯;'这样其他用户将继续使用旧索引,不能苦slowere查询 –

+0

该帖指出,你付出的更快副本价格是缺少索引一段时间。即如果您在一个事务中完成所有操作,则删除索引不会提高'copy'的性能。 (这将不得不基准确定,但对我来说它确实有道理),但这正是文档目前所说的。我没有看到为什么文档能够清楚地表明在这种情况下可用性和速度之间存在权衡,如果您可以在一次交易中完成所有工作,那么没有理由。 –

相关问题