[英]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.