2016-09-07 83 views
0

編輯:對不起,我應該更好地解釋一下,數據不在銷售隊伍中,從後端轉儲,ID字段是字母數字[例如。 00190000010PBdSAAX],一般都是18長&總是唯一的。我將對數據類型進行一些更改,刪除帶引號的標識符,並對索引進行一些更改,看看我如何去,謝謝!PostgresSQL從另一個表更新一個表

我正在使用Postgresql 9.5。我將1個表更新爲另一個表,兩個表在結構上是相同的,一個有200萬個記錄[目標],另一個大約70k [來源],基本上只是對現有數據進行更新並使用獨特的方式插入任何新記錄ID來檢查。

即使沒有什麼可以更新,它只是掃描記錄,它仍然需要5分鐘更長的時間,當有東西需要更新時,嘗試使用或不使用索引,連接這兩個字段的方式稍有不同[只有WHERE和實際加入]。只是想知道是否有更好的方法來做到這一點,或者如果我這樣做只是錯誤的,只用了幾天的Postgres。

我知道⑤分鐘沒什麼大不了[更長,如果它執行任何更新],但其約9其他表&類似的過程,這是一箇中等規模的例子

兩個表看起來像下面的[但與不同的表名稱僅]

CREATE TABLE public."Cases" 
(
    "Past_Due__c" character varying(255), 
    "Case_Age__c" character varying(255), 
    "Next_Step_Due_Date__c" character varying(255), 
    "Id" character varying(255), 
    "AccountId" character varying(255), 
    "Account_Number__c" character varying(255), 
    "Account_Type__c" character varying(255), 
    "CaseNumber" character varying(255), 
    "CaseSubTypeDetail__c" character varying(255), 
    "Case_Sub_Type__c" character varying(255), 
    "Case_Type__c" character varying(255), 
    "ClosedDate" character varying(255), 
    "Collections_Step__c" character varying(255), 
    "Customer_Number__c" character varying(255), 
    "Next_Collections_Step__c" character varying(255), 
    "Origin" character varying(255), 
    "Priority" character varying(255), 
    "Related_Complaint_Case__c" character varying(255), 
    "Status__c" character varying(255), 
    "Subject" text, 
    "Type" character varying(255), 
    "CreatedDate" character varying(255), 
    "OwnerId" character varying(255), 
    "ContactId" character varying(255), 
    "Status" character varying(255), 
    "Case_Comments__c" text, 
    "Subscription__c" character varying(255), 
    "Description" text, 
    "Case_Outcome__c" text, 
    "Case_Outcome_Reason__c" text, 
    "Adjustment_Amount__c" character varying(255), 
    "Product_Adjustment_Amount__c" character varying(255), 
    "Product_Adjustment_Reason__c" character varying(255), 
    "Service__c" character varying(255), 
    "ParentId" character varying(255) 
) 
WITH (
    OIDS=FALSE 
); 

更新腳本如下

update public."cases" t2 
set past_due__c = t1.past_due__c, case_age__c = t1.case_age__c, next_step_due_date__c = t1.next_step_due_date__c, accountid = t1.accountid, account_number__c = t1.account_number__c, account_type__c = t1.account_type__c, casesubtypedetail__c = t1.casesubtypedetail__c, case_sub_type__c = t1.case_sub_type__c, case_type__c = t1.case_type__c, closeddate = t1.closeddate, collections_step__c = t1.collections_step__c, customer_number__c = t1.customer_number__c, next_collections_step__c = t1.next_collections_step__c, origin = t1.origin, priority = t1.priority, related_complaint_case__c = t1.related_complaint_case__c, status__c = t1.status__c, subject = t1.subject, type = t1.type, ownerid = t1.ownerid, contactid = t1.contactid, status = t1.status, case_comments__c = t1.case_comments__c, subscription__c = t1.subscription__c, description = t1.description, case_outcome__c = t1.case_outcome__c, case_outcome_reason__c = t1.case_outcome_reason__c, adjustment_amount__c = t1.adjustment_amount__c, product_adjustment_amount__c = t1.product_adjustment_amount__c, product_adjustment_reason__c = t1.product_adjustment_reason__c, service__c = t1.service__c, parentid = t1.parentid, billing_account__c = t1.billing_account__c, billing_account_credit_balance__c = t1.billing_account_credit_balance__c, billing_address__c = t1.billing_address__c, lastmodifiedbyid = t1.lastmodifiedbyid, lastmodifieddate = t1.lastmodifieddate 
from public."temp_update_cases" t1 
where t1.id = t2.id 

一切我需要做我想通了,但是這一次是殺害我

+0

還注意到我沒有觸及任何默認設置,並且我在運行更新之前抽空 –

+0

無關,但是:您應該**避免引用標識符。 –

+0

請編輯您的問題並添加使用'explain(analyze,verbose)'生成的執行計劃。 [_Formatted_](http://stackoverflow.com/editing-help#code)**文本**,請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i - 未上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557)。有關如何詢問與性能相關的問題的更多信息,另見http://wiki.postgresql.org/wiki/SlowQueryQuestions。 –

回答

1

您的查詢基本上是這樣的:

update public."cases" t2 
set . . . 
from public."temp_update_cases" t1 
where t1.id = t2.id; 

我建議指標:

create index idx_cases_id on public."cases"(id); 
create index idx_temp_updte_cases_id on public."temp_update_cases"(id); 

注:

  • 我的意見是,引用的標識符是同意不是一個好主意。
  • 你的表應該有某種主鍵。名爲id的專欄是一個很好的候選人。對於主鍵,serial通常比字符串更好。