나는 큰 열을 저장하는 테이블을 가져옵 업데이트를 자주. 지 수집 업데이트를 직접적으로 원본 테이블이기 때문에 발생시키는 대부분의 경우,소수 업데이트를 일으키는 전체 표 마이크로 파티션을 재건. 대신 나는 스트림 업데이트를 업데이트 테이블을 쿼리 시간에 제가 결합니다. 실제로 이 밖으로 작동합니다.
그래서 단순화하는 것,내가 이것을 던진에서 보기 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'
어떤 미친 아이디어가?