Mam wielki tabela przechowywania kolumn, która jest często aktualizowana. Nie pobierania aktualizacji bezpośrednio do oryginalnej tabeli, bo w większości przypadków to doprowadzi do tego, że mała ilość aktualizacji doprowadzi do przebudowy całego mikro-klucza tabeli. Zamiast tego przedstawię aktualizacji w tabeli aktualizacji i podczas kwerendy połączyć oba. W praktyce działa to dobrze.
Więc uprościć sytuację, przedstawię to w postaci 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
)
Oba users
stół i user_changes
tabela ma ten sam schemat, co i konfiguracja wybranych partycji. W ten sposób mogę korzystać z listy rozwijanej predykatów w widoku, aby wybrać użytkowników jedynie w zakresie prawidłowego klucza. Załóżmy, że to account_id
.
SELECT * FROM users_view
WHERE account_id = 1234
Ale w users
stół trochę więcej, niż user_changes
tabela i chciałbym dodać jeszcze więcej predykatów w users
tabela bez dodawania dodatkowych predykatów w user_changes
stół. Dlaczego? Bo na zgodność z users
tabela, choć dokładna na 98%, zawiera wyniki fałszywie dodatnie/ujemne wyniki. Szczegóły user_changes
są niezbędne do tego, aby wszystko naprawić. Jak by to wyglądało poza prezentacji, to:
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'
Jak by nieciekawie to wyglądało, to o wiele bardziej efektywne. Wszystkie warunki mogą być zastosowane do znacznie większej users
tabela, ale tylko niezmienne warunki mogą być zastosowane do users_changes
tabela. czyli użytkownik może zmieniać miasta, ale użytkownik nie może zmieniać konta. Drugi uruchomienie wszystkich warunków po zjednoczeniu polega na tym, aby uchwycić wszystkie zmiany, które user_changes
wprowadziła.
To pompatycznie pisać, a tym bardziej w miarę zwiększania się złożoności zapytania i zaangażowania twórców zapytań. Dlatego szukam sposobu, aby przekonać harmonogramu sql pominąć usuwanie predykatów niektórych predykatów na moim user_changes
tabela bez konieczności formatowania zapytanie w ten sposób. Najlepiej z widokiem.
PSUEDO SQL. PSUEDO SQL. PSUEDO SQL
W moich najśmielszych marzeniach mógłbym określić harmonogramu zapytań, gdzie może korzystać z predykaty partycji, a gdzie może korzystać z predykatów, nie odnoszące się do sekcji.
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'
Jakieś szalone pomysły?