2015-12-17 75 views
0

我正在嘗試更新表格中的6000行左右,但我的查詢從未結束。 我已經把數據更新到臨時表中並使用連接來更新行。 這在Sql Server中工作得非常快,但在Postgresql中它永遠不會結束。 我正在更新大約40列。 這是我正在運行的SQL。在Postgresql中更新表格行花費太多時間

UPDATE "STG_magento_de".sales_flat_order 
SET customer_id = b.customer_id 
    ,created_at = b.created_at 
    ,updated_at = b.updated_at 
    ,coupon_code = b.coupon_code 
    ,box_id = b.box_id 
    ,beautytrends_glossydots = b.beautytrends_glossydots 
    ,billing_address_id = b.billing_address_id 
    ,shipping_address_id = b.shipping_address_id 
    ,base_discount_amount = b.base_discount_amount 
    ,base_discount_canceled = b.base_discount_canceled 
    ,base_discount_invoiced = b.base_discount_invoiced 
    ,base_discount_refunded = b.base_discount_refunded 
    ,base_grand_total = b.base_grand_total 
    ,base_shipping_amount = b.base_shipping_amount 
    ,base_shipping_canceled = b.base_shipping_canceled 
    ,base_shipping_invoiced = b.base_shipping_invoiced 
    ,base_shipping_refunded = b.base_shipping_refunded 
    ,base_shipping_tax_amount = b.base_shipping_tax_amount 
    ,base_shipping_tax_refunded = b.base_shipping_tax_refunded 
    ,base_subtotal = b.base_subtotal 
    ,base_subtotal_canceled = b.base_subtotal_canceled 
    ,base_subtotal_invoiced = b.base_subtotal_invoiced 
    ,base_tax_amount = b.base_tax_amount 
    ,base_tax_canceled = b.base_tax_canceled 
    ,base_tax_invoiced = b.base_tax_invoiced 
    ,base_tax_refunded = b.base_tax_refunded 
    ,base_to_global_rate = b.base_to_global_rate 
    ,base_to_order_rate = b.base_to_order_rate 
    ,base_total_canceled = b.base_total_canceled 
    ,base_total_invoiced = b.base_total_invoiced 
    ,base_total_invoiced_cost = b.base_total_invoiced_cost 
    ,base_total_offline_refunded = b.base_total_offline_refunded 
    ,base_total_online_refunded = b.base_total_online_refunded 
    ,base_total_paid = b.base_total_paid 
    ,base_total_qty_ordered = b.base_total_qty_ordered 
    ,base_total_refunded = b.base_total_refunded 
    ,increment_id = b.increment_id 
    ,order_type = b.order_type 
    ,STATUS = b.STATUS 
    ,is_chargerun = b.is_chargerun 
    ,chargeback_flag = b.chargeback_flag 
    ,gift_message_id = b.gift_message_id 
    ,dispatch = b.dispatch 
FROM "STG_magento_de".sales_flat_order a 
JOIN "STG_magento_de".sales_flat_order_temp b ON a.entity_id = b.entity_id 
+0

您是否看過這裏發佈的解決方案http://dba.stackexchange.com/questions/41059/optimizing-bulk-update-performance-in-postgresql?newreg=4b48689f176940b2bd4862b8edd83425? – Dukefirehawk

+0

是的。我正在使用那裏提到的使用臨時表的方法。我沒有索引,我也使用temp_buffer 3000MB。但仍然永遠運行。我的數據只有6000行。 – jmf

回答

3

From the manual:

注意,目標表不得出現在from_list,除非你打算自連接(在這種情況下,它必須與from_list別名出現)。

(重點煤礦)

所以你真的想:

UPDATE "STG_magento_de".sales_flat_order 
SET customer_id = b.customer_id, 
    .... 
from sales_flat_order_temp b --<< do NOT repeat the target table here 
where "STG_magento_de".sales_flat_order = b.entity_id` 

無關,而是:你應該避免那些可怕的帶引號的標識符。他們比他們的價值更麻煩。

+0

其實PGAdmin花費太多時間來運行更新。當我使用Taled運行更新查詢時,只需要一秒鐘。 – jmf