我有一個包含數百萬條記錄的表,我正在運行查詢並將結果插入另一個表中,客戶將查詢。這個過程大約需要20秒。Postgres中的Flip Flipping數據表
如何運行此查詢,構建此新表而不影響可能正在對目標表運行查詢的任何客戶端?
例如,我跑
BEGIN;
DROP TABLE target_table;
SELECT blah, blahX, blahY
INTO target_table
FROM source_table
GROUP BY blahX, blahY
COMMIT;
然後阻止查詢:
SELECT SUM(blah)
FROM target_table
WHERE blahX > x
在有工作的日子,一些SQL Server數據庫管理員的我記得他們創建臨時表,然後在當前的翻轉這些表。這在Postgres中可行嗎?
出於興趣,如果另一個會話在您嘗試刪除時針對'target_table'運行查詢,將另一個表重命名爲'target_table'並執行COMMIT,會發生什麼? – NPE
交易受益於隔離,所以通常會出現「表可用,查詢正常」,「交易開始,表鎖定,無查詢」,「交易完成,查詢正常」。至少它應該這樣工作......我認爲表格鎖定在target_table上是隱含的。唯一的問題是「查詢是否等待表可以查看新的target_table作爲他們試圖查詢的表?」。老實說,我沒有線索,如果我不希望引擎處理它,我肯定會更喜歡刪除/插入解決方案;) –
(+1)非常好,謝謝你。 – NPE