[英]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 | 缺點 |
我想要的是
和
我在下面寫了查詢,但執行起來花費了太多時間(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.