선택적인 조건자 Pushdown 보기

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 테이블 동일한 방식뿐만 아니라 어떤 파티션을 구성합니다. 이 방법을 사용할 수 있는 조건자 pushdown 에서 보기를 선택된 사용자만에는 올바른 파티션입니다. 말하자이 account_id.

SELECT * FROM users_view
WHERE account_id = 1234

users 테이블이 아주 조금보다 크 user_changes 테이블,그리고 나는 다음과 같를 밀어 더욱 조건자로 users 테이블 없이 밀어 추가적인 조건자로 user_changes 테이블. 왜? 기 때문에 일치에 대 users 테이블,동 98%정확는 틀린 확실성/네거티브. 에서 정보 user_changes 하는 데 필요한 곧바로 기록을 설정할 수 있습니다. 무엇이 같을 것이다 외부에서 보기 this:

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 테이블. 즉,사용자가 변경될 수 있 도시,하지만 사용자를 변경할 수 없습니다 계정. 두 번째 실행의 모든 후 조건 union 를 잡으려고 어떤 변화 user_changes 소개한다.

이것은 복잡하게 작성하고,더 그로 쿼리가 복잡하고 쿼리 작다. 그래서 내가 찾는 방법을 설득 sql 플래너를 건너뛰기 조건자 pushdown 의 일부 조건에 나 user_changes 테이블이 없는 형식은 다음과 같이 쿼. 이상적으로 보기입니다.

비 SQL. 비 SQL. 비 SQL

꿈에 내가 말할 수 있는 쿼리 계획 수 있는 파티션 사용 조건자,그리고 그것이 사용할 수 있는 곳에 비 partition 조건자.

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ý
..................................................................................................................