如何加快bigquery中的范围连接

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)