我有一个大表 作为此操作的一部分,从第一次插入返回的行id需要在第二次插入第二个表时使用.
我使用的CTE看起来像这样:
WITH inserted_data AS (
INSERT INTO table1 (column1, column2, column3, column4)
SELECT value1, value2, value3, value4
FROM original_table
RETURNING rowid, column4
)
INSERT INTO table2 (table1_id, column4)
SELECT rowid, column4
FROM inserted_data;
问题是,这太慢了,令人无法接受.对于仅4800行,它需要21秒,而对于9600行,它需要大约50秒.按照这个速度,我预计5000万张唱片需要3天左右的时间.我有大约两个小时的时间限制.
如果只执行第一次INSERT(不执行CTE),则查询速度要快100倍,分别是4800和9600行的200毫秒和500毫秒.我知道第二次插入的时间也可以忽略不计.按照这个速度,查询将在分配的时间内完成.
问题是,我如何重写查询才能以单个查询可以完成的速度执行.将所有数据从数据库转移到外部程序将是一个麻烦和容易出错的问题,并且需要额外的资源.如果我做一些事情,比如用循环编写函数,那么我不会一下子插入,而且我预计那里的性能也会很差.我不认为使用临时餐桌会有什么帮助,因为问题似乎仅仅是CTE的存在.
我试过这个:
INSERT INTO table2 (table1_id, column4)
SELECT rowid, column4
FROM (
WITH inserted_data AS (
INSERT INTO table1 (column1, column2, column3, column4)
SELECT value1, value2, value3, value4
FROM original_table
RETURNING rowid, column4
)
)
但这给了我:
syntax error at or near "INTO"