簡體   English   中英

POSTGRES - 我如何優化這個連接查詢

[英]POSTGRES - How do i optimize this join query

我有一張如下表,用於存儲員工詳細信息

空虛的 屬性 價值 開始日期 結束日期
E1 積極的 錯誤的 2020-01-01 2022-05-05
E1 積極的 真的 2022-06-06 9999-12-31
E1 分支 紐約市 2022-01-01 9999-12-31
E2 積極的 真的 2020-01-01 9999-12-31

然后是另一個有地址詳細信息的表

空虛的 城市
E1 缺點

我想要的是

  1. 地址表中沒有條目的所有員工 ID 的列表

  1. 屬性 ACTIVE 的當前值(今天的值)為 TRUE 的所有員工。

我在下面寫了查詢,但執行起來花費了太多時間(3-4 分鍾)。 有什么辦法可以優化此查詢。

select distinct(emp.empid) from schema1.employees emp, schema2.address add 
where emp.empid = add.empid 
  and (emp.attribute ='ACTIVE' and emp.val in ('TRUE') 
  and CURRENT_DATE BETWEEN emp.start_date and emp.end_date)
  and emp.emp_id not in (select empid from schema2.address add2)
limit 20

我只對您的查詢進行了微小的修改,以提高性能。

select emp.empid
from schema1.employees emp
left join schema2.address add on emp.empid = add.empid 
where emp.attribute ='ACTIVE' 
  and vpd.val = 'TRUE'
  and emp.start_date <= CURRENT_DATE 
  and emp.end_date >= CURRENT_DATE 
  and add.empid is null;

以下索引也很有用。 如果您還沒有它們,請添加它們並重試。

create index ix1 on schema1.employees (attribute, val, start_date, end_date);

create index ix2 on schema2.address (empid);

從描述中不清楚你的兩個條件應該如何結合。

要讓所有員工都通過您的兩個條件之一

SELECT e.empid
FROM   schema1.employees e
WHERE  e.attribute = 'ACTIVE'
AND    e.val  -- = true
AND    CURRENT_DATE BETWEEN e.start_date AND e.end_date
OR     NOT EXISTS (SELECT FROM schema2.address a WHERE a.empid = e.empid);

讓所有員工都通過你的兩個條件

...
AND    NOT EXISTS (SELECT FROM schema2.address a WHERE a.empid = e.empid);

假設您只添加了DISTINCT (錯誤地使用括號)來處理由連接引入的重復項。 首先不使用EXISTS表達式復制行,我們也不需要DISTINCT

暫無
暫無

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

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