我需要創建臨時表,然後在選擇查詢中使用該臨時表。當我將這些語句放入函數中時,運行第二個語句需要很長時間。就像這樣:CREATE TABLE AS後SELECT需要很長時間才能運行
BEGIN
CREATE TABLE temp AS SELECT….
INSERT INTO target_table SELECT * FROM tableA join temp…
END;
我意識到,當我與運行之間約60秒單獨運行。其中,第二條語句需要約2秒運行。如果我等了45秒,則需要很長時間才能運行。例如,如果我執行以下語句逐個(而不是在一個函數):
CREATE TABLE temp AS SELECT….
SELECT pg_sleep(60);
INSERT INTO target_table SELECT * FROM tableA join temp…
這需要很短的時間來執行的插入的一個。但是當我突出顯示他們並將它們一起運行時,需要永久執行。
我試圖把它們放在不同的BEGIN/END塊中的一個函數中。像這樣
BEGIN
CREATE TABLE temp AS SELECT….
SELECT pg_sleep(120);
END;
BEGIN
INSERT INTO target_table SELECT * FROM tableA join temp…
END;
仍然沒有工作。
爲什麼要在兩者之間等待?爲什麼他們在工作時不工作?有沒有解決這個問題的方法?
我確實使用了子查詢。出於某種原因,子查詢也花了很長時間才能運行。臨時表的速度要快得多。我還使用了CREATE TABLE temp DROP ON COMMIT,並且這種方式也不起作用。 – toanong
那語法是完全無效的。 「在提交刪除行時創建全局臨時表(col1,col2 ...)」。我認爲在移動到臨時表之前,您應該做得更好,以嘗試和診斷運行緩慢的子查詢的原因,可能會將其重寫爲公用表表達式。 –