Lea*_*oop 1 sql postgresql query-optimization google-bigquery
使用范围条件与同一张表进行自连接。下面是sql语句。
select
current_rec .*
,compare_rec.employee_id as less_salary_employee
from
hr.employees current_rec
left join hr.employees compare_rec
on current_rec.hire_date < compare_rec .hire_date and current_rec.salary < compare_rec.salary
order by current_rec .employee_id ;
Run Code Online (Sandbox Code Playgroud)
对于300K记录,需要更多45~60分钟。经过谷歌搜索后,我发现 Binned range join 优化会有所帮助。我阅读这篇文章是为了提高查询性能。[https://select.dev/posts/snowflake-range-join-optimization#how-to-optimize-range-joins-in-snowflake][1]。但无法理解。有人可以解释一下吗?。特别分箱范围优化部分。如果您提供有帮助的视觉表示
小智 5
创建一个 CTE,根据雇用日期将员工表分入范围 将 CTE 加入自身,过滤 current_rec.bin >=compare_rec.bin 以仅加入相关的 bin 添加针对薪资的附加过滤器以完成范围加入逻辑 这允许加入通过避免比较不相关的 bin 之间的行,以更优化的方式进行。
WITH bins AS (
SELECT *,
CASE
WHEN hire_date < '2010-01-01' THEN 1
WHEN hire_date >= '2010-01-01' AND hire_date < '2015-01-01' THEN 2
WHEN hire_date >= '2015-01-01' AND hire_date < '2020-01-01' THEN 3
WHEN hire_date >= '2020-01-01' THEN 4
END AS bin
FROM hr.employees
)
SELECT
current_rec.*,
compare_rec.employee_id AS less_salary_employee
FROM bins current_rec
LEFT JOIN bins compare_rec
ON current_rec.bin >= compare_rec.bin
AND current_rec.salary < compare_rec.salary
ORDER BY current_rec.employee_id;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |