Mám velký sloupec, obchod, tabulka, že dostane časté aktualizace. Nechci spolknout aktualizace přímo do zdrojové tabulky, protože to by mohlo způsobit, ve většině případů, malý počet aktualizací, protože plný stůl micro oddíl obnovit. Místo toho jsem stream aktualizace k aktualizaci tabulky, a na dotaz, kdy jsem kombinovat obojí. V praxi to funguje dobře.
Takže zjednodušit věci, hodím to na pohled 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
tabulka a user_changes
tabulky mají stejný režim, stejně jako některé oddílu konfigurace. Tento způsob, jak mohu použít predikát zásobníkových na zobrazení pouze vybraných uživatelů ve správný oddíl. Řekněme, že tohle je account_id
.
SELECT * FROM users_view
WHERE account_id = 1234
Ale users
tabulka je trochu větší než user_changes
stolu, a já bych rád, aby se zasadila ještě více predikáty dolů users
tabulka aniž tlačí další predikáty dolů user_changes
tabulka. Proč? Protože odpovídající na users
tabulky, zatímco 98% přesné, má falešné pozitivy/negativy. Detaily z user_changes
je zapotřebí, aby se nastavit na pravou míru. Jak by to vypadalo mimo pohled je tento:
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 ošklivé, jak to vypadá, je to mnohem výkonější. Všechny podmínky, mohou být použity pro mnohem větší users
tabulka, ale jen neměnných podmínek může být aplikován na users_changes
tabulka. tj. uživatel může změnit městech, ale uživatel nemůže měnit účty. Druhý běh všech podmínek poté, co unie je, aby chytit nějaké změny user_changes
zavedena.
Tohle je těžkopádné psát, a ještě více tak, dotaz se stává složitější a dotaz stavitelé zapojit. Takže hledám způsob jak se přesvědčit sql plánovač přeskočit predikát zásobníkových některé predikáty na můj user_changes
tabulky, aniž byste museli formátovat dotaz, jako je tento. Ideálně s výhledem.
PSEUDO SQL. PSEUDO SQL. PSEUDO SQL
V mých nejdivočejších snech bych mohla říct dotazu plánovač, kde je možné použít oddíl predikáty, a kde je možné použít non-oddíl predikáty.
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'
Nějaké bláznivé nápady?