簡體   English   中英

Postgres 查詢左連接花費太多時間

[英]Postgres query left join take too time

我對此查詢有疑問。 它 go 在循環中,我的意思是 15 分鍾后查詢未完成但是如果刪除其中一個左連接,我哪里錯了?

Select distinct a.sito,
Count(distinct a.id_us) as us,
Count (distinct b.id_invmat) as materiali,
Count (distinct c.id_struttura) as Struttura,
Count(distinct d.id_tafonomia) as tafonomia
From us_table as a
Left join invetario_materiali as b on a.sito=b.sito
Left join struttura_table as c on a.sito=c.sito
Left join tafonomia_table as d on a.sito=d.sito
Group by a.sito
Order by us

謝謝E

在這種情況下,相關子查詢可能是最簡單的方法:

select s.sito,
      (select count(*) from invetario_materiali m where s.sito = m.sito) as materiali,
      (select count(*) from struttura_tablest where s.sito = st.sito) as Struttura,
      (select count(*) from tafonomia_table t where s.sito = t.sito) as tafonomia
from (select sito, count(*) as us
      from us_table
      group by sito
     ) s
order by us;

由於兩個原因,這應該比您的版本快得多。 首先,它避免了外部聚合。 其次,它避免了表格之間的笛卡爾積。

您可以通過在sito上的每個輔助表上創建索引來加快速度。

假設id_usid_invmatid_strutturaid_tafonomia都是PRIMARY KEY CLUSTERED

您應該在連接列上添加索引:

CREATE INDEX IX_SITO ON us_table ( sito ASC) ;
CREATE INDEX IX_SITO ON invetario_materiali ( sito ASC) ;
CREATE INDEX IX_SITO ON struttura_table ( sito ASC) ;
CREATE INDEX IX_SITO ON tafonomia_table ( sito ASC) ;

比你可以通過這種方式降低復雜性:

with
_us_table as (
    select sito, count(distinct a.id_us) us
    from us_table a
    group by sito
),
_invetario_materiali as (
    select sito, count(distinct b.id_invmat) materiali
    from invetario_materiali b
    group by sito
),
_struttura_table as (
    select sito, count(distinct c.id_struttura) Struttura
    from struttura_table c
    group by sito
),
_tafonomia_table as (
    select sito, count(distinct d.id_tafonomia) tafonomia
    from tafonomia_table d
    group by sito
)
Select a.sito, a.us, b.materiali, c.Struttura, d.tafonomia
From _us_table as a
Left join _invetario_materiali as b on a.sito=b.sito
Left join _struttura_table as c on a.sito=c.sito
Left join _tafonomia_table as d on a.sito=d.sito
Order by a.us;

應該快得多

不幸的是,使用索引很難改進COUNT(DISTINCT...) 但是,我們至少可以嘗試添加涵蓋查詢中所有連接的索引:

CREATE INDEX inv_mat_idx ON invetario_materiali (sito, id_invmat);
CREATE INDEX strut_tbl_idx ON struttura_table (sito, id_struttura);
CREATE INDEX taf_tbl_idx ON tafonomia_table (sito, id_tafonomia);

請注意,上述索引只會幫助連接,不會影響sito的聚合步驟和每組的非重復計數。 正如@jarlh 在評論中指出的那樣, SELECT DISTINCT是多余的,因為您使用的是GROUP BY ,所以只做一個簡單的SELECT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM