【问题标题】:How to join two large table in postgres and get data faster如何在 postgres 中加入两个大表并更快地获取数据
【发布时间】:2021-05-29 05:29:13
【问题描述】:

我正在处理两个包含大量数据的表,每个表超过 1000 万。我需要连接两个表以获得所需的结果,但由于容量大,需要花费过多的时间。我试图分别执行两个表的每个操作,但我认为我的实现不正确。我正在发布表结构和我尝试过的查询

CREATE TABLE supply.supply_detail (
  supply_detail_id bigint NOT NULL 
    DEFAULT nextval('supply.supply_detail_supply_detail_id_seq'::regclass),
  supl_num numeric(15,0),
  str numeric(7,0),
  supl_dte character varying(10) COLLATE pg_catalog."default",
  supl_num character varying(14) COLLATE pg_catalog."default",
  cl_lvl numeric(7,0),
  stp character varying(15) COLLATE pg_catalog."default",
  poc_num numeric(3,0),
  qty numeric(6,0),
  sCost numeric(11,4)
);

还有:

CREATE TABLE supply.supply_header (
  supply_header_id bigint NOT NULL
    DEFAULT nextval('supply.supply_header_supply_header_id_seq'::regclass),
  supl_num numeric(15,0),
  supl_name character varying(30) COLLATE pg_catalog."default",
  lclV character varying(5) COLLATE pg_catalog."default",
  mkt numeric(7,0),
  supl_dte character varying(10) COLLATE pg_catalog."default",
  supl_num character varying(12) COLLATE pg_catalog."default",
  ctrl_num numeric(7,0),
  depar_dte character varying(10) COLLATE pg_catalog."default",
  rrturn_typ character varying(1) COLLATE pg_catalog."default",
  copy_on numeric(11,2),
  expense numeric(11,2),
  amt numeric(11,2),
  inv_dte character varying(10) COLLATE pg_catalog."default",
  fndg_dte character varying(10) COLLATE pg_catalog."default"
);

这是我尝试过的查询:

select SUPL_NUM, VND_NUM, SUPL_NAME, STORE
from (
  select
    supH.supl_num SUPL_NUM, supH.ora_vendor VND_NUM,
    supH.supl_name SUPL_NAME, supH.str STORE,
    supH.supl_dte, supH.supl_num Hsupl_NUM, supH.ctrl_num
  from supply.supply_header supH
 ) HTBL,
 (
   select
     supD.upc, supD.line_num,supD.qty_purchase,
     supD.cost,supD.retail, supD.adj_ind, supD.supl_num Dsupl_NUM
   from supply.supply_detail supD
 ) DTBL
 where Hsupl_NUM = Dsupl_NUM  
 AND Dsupl_NUM = '394140308130'
 AND SUPL_NUM = 41219 

任何人都可以提出一个更好的方法来编写这个查询,它可以在最短的时间内给出一个最佳的结果。

【问题讨论】:

  • 查看Slow queries,了解有关如何提高性能和报告必要信息以提供建议的提示。

标签: sql postgresql subquery large-data


【解决方案1】:

我认为性能问题的一个重要因素是您没有分享是否为任一表创建了任何索引 - 我认为如果您在 supl_num 上为两个表添加索引,您将获得更快的性能.

但是,最好的办法是首先查看EXPLAIN ANALYZE <your_query> 并查看瓶颈在哪里。如果您发布EXPLAIN ANALYZE 的输出,我们可以尝试更好地帮助您。

另请注意,您的 SUPL_NUMsupH.supl_num 是同一列,如果我们简化您的查询,它将如下所示:

select supH.supl_num, supH.ora_vendor, supH.supl_name, supH.str
  from supply.supply_header supH
  join supply.supply_detail supD
    on supH.supl_num=supD.supl_num
 AND supD.supl_num='394140308130'
 AND supH.supl_num=41219;

这将返回零行。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多