我正在尝试在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;
所以它根本没有插入。但它也没有出错。看看系统资源的使用情况,它似乎没有做任何事情,进程没有提取资源。
查看其他正在运行的查询,我有权查看的任何其他查询都没有触及这两个表,而且只有我在使用它们。
我不知道如何解决问题,因为没有错误。它只是没有做任何事情。任何关于可能出错的事情或要检查的事情的想法都将非常有帮助。
4条答案
按热度按时间xqkwcwgp1#
为了将来遇到这个问题的人:
经过长时间的讨论(参见上面注解中的linked discussion),问题原来与psycopg2在内存中缓冲查询有关。
另一个有用的提示:插入到一个有索引的表中是很慢的,所以在批量加载之前删除索引,然后在批量加载之后再添加索引会有所帮助。
dw1jzc5e2#
在我情况下,这是日期格式问题。我在interting到DB之前注解了日期属性,它工作了。
xu3bshqb3#
在我的例子中,它是一个
TRIGGER
,在同一个表上,我正在更新,它失败了,没有错误。停用触发器,更新工作完美。
ru9i0ody4#
尝试在查询的末尾使用分号来获取调试信息。在我的案例中,它失败了,因为它无法找到insert语句的结尾。