PostgreSQL从另一个表更新一个表

时间:2016-09-07 09:39:36

标签: sql postgresql sql-update

编辑:对不起,我应该更好地解释一下,数据不在salesforce中,从后端转储,ID字段是字母数字[例如。 00190000010PBdSAAX],一般都是18个长度&总是独一无二的。我将对数据类型进行一些更改,删除引用的标识符,并对索引进行一些更改,看看我是怎么做的!

我正在使用PostgreSQL 9.5。我将1个表更新为另一个表,两个表的结构相同,一个有200万个记录[目标],另一个大约70k [源],这基本上只是对现有表执行更新并使用任何新记录插入要检查的唯一ID。

它比我想象的要花费更长的时间,即使没有任何内容需要更新,它只是扫描记录,它仍然需要5分钟&当有更新的东西时,甚至更长时间,尝试使用和不使用索引,以稍微不同的方式加入2个字段[仅使用WHERE和实际的JOIN]。只是想知道是否有更好的方法,或者我做的只是完全错误,只使用Postgres几天。

我知道5分钟没什么大不了的[如果它执行任何更新就会更长],但是对于其他大约9个表格来说它是一个类似的过程。这是一个中等大小的例子

这两个表看起来如下[但只有不同的表名]

param2_no

更新脚本位于

之下
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
);

我需要做的其他事情我想通了,但是这个是杀了我

1 个答案:

答案 0 :(得分: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是主键比字符串更好的选择。