我有一个大型列储存表,得到经常更新。 我不在摄取的更新直接纳入的来源表,因为这将导致,在大多数情况下,一个小数字的更新,导致一个完整的表微分区重建。 而不是我流的更新,以更新表,和在查询时间我把两者结合起来。 在实践中这项工作。
所以事情简单化,我会把这个扔在一看 users_view
.
CREATE OR REPLACE VIEW users_view AS (
SELECT * FROM users
UNION ALL
SELECT * FROM user_changes
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
既 users
表, user_changes
表有相同的方案,以及一些分区结构。 这种方式我可以使用谓词下推上查看,只选择内的用户正确的分区。 让我们这样说是的 account_id
.
SELECT * FROM users_view
WHERE account_id = 1234
但 users
表是相当大比 user_changes
表,并且我想要推动更谓词下来的 users
表,而推动其他谓词下来的 user_changes
表。 为什么? 因为匹配 users
表,而98%的准确的、具有误/底片。 从细节的 user_changes
需要。 什么这看起来像外面的一个观点是这样的:
SELECT * FROM (
SELECT * FROM users
WHERE account_id = 1234 AND city = 'Chicago'
UNION ALL
SELECT * FROM user_changes
WHERE account_id = 1234
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
WHERE account_id = 1234 AND city = 'Chicago'
作为讨厌的,因为这看起来,这是更高的性能。 所有的条件可以适用于规模大得多的 users
表,但唯一不变的条件,可以应用到的 users_changes
表。 即一个用户可以改变城市,但是,用户不能改变的帐户。 第二次运行的所有条件之后,该联盟是赶上的任何改变的 user_changes
介绍。
这个是麻烦写的,更是这样的查询变得复杂和查询建筑商参与。 所以我在寻找方式方法,以说服sql规划跳下推谓的某些谓词上我的 user_changes
表,而无需对格式的查询这样。 理想的情况。
伪SQL。 伪SQL。 伪SQL
在我最疯狂的梦想我能告诉查询规划,在那里它可以利用分区谓词,在那里它可以使用非分区谓词。
CREATE OR REPLACE VIEW users_view AS (
SELECT * FROM (
SELECT * FROM users
%PARTITION_PREDICATES%
%NON_PARTITION_PREDICATES%
UNION ALL
SELECT * FROM user_changes
%PARTITION_PREDICATES%
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
%PARTITION_PREDICATES%
%NON_PARTITION_PREDICATES%
)
SELECT * FROM users_view
WHERE account_id = 1234 AND city = 'Chicago'
任何疯狂的想法?