【发布时间】:2021-09-01 15:15:13
【问题描述】:
由于雪花缓存结果的方式,我无法找到查询的运行速度,但是这两个查询中的哪一个是“正确”的方法? (或者有更好的方法吗?):
select left.*, right.name from LEFT_TABLE left inner join (
select distinct ID, NAME from RIGHT_TABLE
) right on left.id = right.id;
或:
select left.*, right.name from LEFT_TABLE left inner join (
select any_value(ID) as ID, any_value(NAME) as NAME
from RIGHT_TABLE
group by ID
) right on left.id = right.id;
LEFT_TABLE 看起来像这样:
| A | B | ID |
|---|---|---|
| 13.18 | 677.92 | 112 |
| 15.65 | 971.36 | 113 |
| 2.72 | 991.00 | 114 |
| 33.54 | 755.18 | 116 |
| 5.14 | 588.12 | 115 |
RIGHT_TABLE 看起来像这样:
| PK | ID | NAME |
|---|---|---|
| 251 | 112 | John Doe |
| 287 | 112 | John Doe |
| 232 | 112 | Jane Bow |
| 242 | 113 | Jane Bow |
| 234 | 113 | Jane Bow |
【问题讨论】:
-
它们应该是相同的,但是你可以查看它们的执行计划以了解更多关于每个查询的幕后情况
-
这两个查询做不同的事情。你应该使用你想要的版本。当然,除非您知道对于
id,该名称始终是唯一的。 -
在 RIGHT_TABLE 中相同的
ID总是对应相同的NAME -
既然如此,对于单个查询使用 ANY_VALUE() 会更快,但要注意它对结果集缓存的影响。 ANY_VALUE() 是一个非确定性函数,因此如果像 BI 仪表板之类的东西在表的数据更改之间定期运行查询,Snowflake 将无法使用结果集缓存并且必须再次运行查询。
标签: sql snowflake-cloud-data-platform