postgresql insert语句故障排除,失败且无错误

41ik7eoe  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(428)

我正在尝试在postgres数据库中执行一个非常简单的insert语句。它不工作,但它也没有出错,所以我不知道如何解决问题。下面是语句:

INSERT INTO my_table (col1, col2) select col1,col2 FROM my_table_temp;

temp表中有大约2亿个条目,my_table中有5000万个条目。temp表没有索引或约束,但my_table中的两列都有btree索引,col 1有外键约束。
第一个查询运行了大约20天。上次我尝试了一个大约50 m的类似插入,花了3天,所以我预计它会花一段时间,但不是一个月。此外,my_table并没有变得更长。间隔1天查询,以下生成相同的确切数字。
select count(*)from my_table;
所以它根本没有插入。但它也没有出错。看看系统资源的使用情况,它似乎没有做任何事情,进程没有提取资源。
查看其他正在运行的查询,我有权查看的任何其他查询都没有触及这两个表,而且只有我在使用它们。
我不知道如何解决问题,因为没有错误。它只是没有做任何事情。任何关于可能出错的事情或要检查的事情的想法都将非常有帮助。

xqkwcwgp

xqkwcwgp1#

为了将来遇到这个问题的人:
经过长时间的讨论(参见上面注解中的linked discussion),问题原来与psycopg2在内存中缓冲查询有关。
另一个有用的提示:插入到一个有索引的表中是很慢的,所以在批量加载之前删除索引,然后在批量加载之后再添加索引会有所帮助。

dw1jzc5e

dw1jzc5e2#

在我情况下,这是日期格式问题。我在interting到DB之前注解了日期属性,它工作了。

xu3bshqb

xu3bshqb3#

在我的例子中,它是一个TRIGGER,在同一个表上,我正在更新,它失败了,没有错误。
停用触发器,更新工作完美。

ru9i0ody

ru9i0ody4#

尝试在查询的末尾使用分号来获取调试信息。在我的案例中,它失败了,因为它无法找到insert语句的结尾。

相关问题