我正在尝试执行以下查询,该查询在qualify子句中有很多case语句。
insert into tab2 b
select
a.id,a.name
from tab1 a
where a.country='US'
qualify(
row_number() over(partition by a.university_id
order by
case when a.student_in_computerscience_fl='Y' then 1 else 0 end,
case when a.student_in_chemistry_fl='Y' then 1 else 0 end,
case when a.student_in_electronics_fl='Y' or a.student_in_physics_fl='Y' then 1 else 0 end, )=1)
包含大量案例陈述的合格证书是否会产生性能问题?
还是我必须使用临时表,我将等级(rk)存储为附加字段? 喜欢
insert into tmptab
select
a.id,a.name,
row_number() over(partition by a.university_id
order by
case when a.student_in_computerscience_fl='Y' then 1 else 0 end,
case when a.student_in_chemistry_fl='Y' then 1 else 0 end,
case when a.student_in_electronics_fl='Y' or a.student_in_physics_fl='Y' then 1 else 0 end ) as rk
from tab1 a
where a.country='US'
然后从上面提到的临时表插入最终目标表。
issert into tab2
(name,id)
select name,id from tmptab where rk=1
请分享您的意见。
答案 0 :(得分:1)
第一个解决方案(QUALIFY
)肯定应该比第二个解决方案更快(实现等级)。昂贵的操作有排名(ROW_NUMBER
),你将在两种情况下都这样做。
使用第一个解决方案将避免做的是在tmptab的主索引上进行不必要的数据重新分配,在RowKey上排序(将不必要地发生 - 除非您正在写入NoPI表),然后从tmptab写入和读取数据。
您可以在QUALIFY
子句中查看分析函数结果WHERE
条件(ROW_NUMBER
)。