【发布时间】:2016-09-07 09:39:36
【问题描述】:
编辑:对不起,我应该解释得更好一点,数据来自销售人员,从后端转储,ID 字段是字母数字 [例如。 00190000010PBdSAAX],通常所有长度都是 18 并且始终是唯一的。我将对数据类型进行一些更改,摆脱带引号的标识符,并对索引进行一些更改,看看我该怎么做!
我使用的是 PostgreSQL 9.5。我正在将一个表更新到另一个表,两个表的结构相同,一个有 200 万条记录 [目标],另一个大约 70k [源],这基本上只是对现有的执行更新并使用唯一的插入任何新记录要检查的 ID。
它花费的时间比我想象的要长得多,即使没有什么要更新并且它只是扫描记录,它仍然需要 5 分钟甚至更长的时间,如果有要更新的东西,尝试使用和不使用索引,加入2 个字段以稍微不同的方式 [都只有 WHERE 和实际 JOIN]。只是想知道是否有更好的方法,或者我是否做错了,只使用 Postgres 几天。
我知道 5 分钟没什么大不了 [如果它执行任何更新,则更长],但它对于大约 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
我需要做的所有其他事情我都想通了,但是这个让我很生气
【问题讨论】:
-
还请注意,我没有触及任何默认设置,并且在运行更新之前我会清空
-
不相关,但是:您应该真的避免使用带引号的标识符。
-
请edit您的问题并添加使用
explain (analyze, verbose)生成的执行计划。 Formatted 文本 请no screen shots。另请参阅wiki.postgresql.org/wiki/SlowQueryQuestions,了解有关如何提出与性能相关的问题的更多信息。 -
"Id" character varying(255),看起来不是一个好主意(即使带有 PK约束或索引)。顺便说一句:这看起来更像是一个电子表格而不是数据库表......
标签: sql postgresql sql-update