选择性谓词下推查

0

的问题

我有一个大型列储存表,得到经常更新。 我不在摄取的更新直接纳入的来源表,因为这将导致,在大多数情况下,一个小数字的更新,导致一个完整的表微分区重建。 而不是我流的更新,以更新表,和在查询时间我把两者结合起来。 在实践中这项工作。

所以事情简单化,我会把这个扔在一看 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'

任何疯狂的想法?

1

最好的答案

1

你可以添加其他柱 src 对于确定来源表包谓词的情况下:

select * from
(
SELECT u.*, 'users' as src FROM users u
union all
SELECT uc.*, 'users_changes' as src FROM users_changes uc
) 
WHERE --applied only to users
      case when src  = 'users' 
                 then city = 'Chicago' --predicate wrapped in case
           else true
       end
  --applied to all
  AND account=12345 
2021-11-23 14:58:40

非常酷的想法! 谢谢你!
micah

@海地文职支助团可以包装所谓的单的情况下使用和或: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................