Mám veľké stĺpec uložiť tabuľku, ktorá dostane časté aktualizácie. Nemám prijímate aktualizácie priamo do zdroja tabuľky, pretože to by mohlo spôsobiť, vo väčšine prípadov, malý počet aktualizácií spôsobiť celú tabuľku, micro oblasť prestavať. Namiesto toho som stream aktualizácie aktualizácia tabuľky, a na dotaz čas som sa kombinujú. V praxi to funguje dobre.
Tak zjednodušiť veci, som si hodiť to v zobrazení 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
)
Obe users
tabuľka a user_changes
tabuľky majú rovnaké schémy, rovnako ako niektoré oblasti konfigurácie. Tento spôsob je možné použiť predikát pushdown na zobrazenie len vybraným používateľom v rámci správnu oblasť. Povedzme, že je to account_id
.
SELECT * FROM users_view
WHERE account_id = 1234
Ale users
tabuľka je trochu väčší ako user_changes
tabuľka a chcel by som, aby sa zasadila ešte viac predikáty nadol users
tabuľky bez tlačí ďalšie predikáty nadol user_changes
tabuľka. Prečo? Pretože vyhovujúce na users
tabuľka, pričom 98% presné, má falošné pozitíva/negatíva. Údaje z user_changes
sú potrebné nastaviť záznam rovno. Čo by to vyzerať mimo názoru je toto:
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'
Ako škaredé, ako to vyzerá, to je oveľa viac, výkonné. Všetky podmienky, môže byť aplikovaný na oveľa väčší users
tabuľky, ale iba nemenné podmienky, môže byť aplikovaný na users_changes
tabuľka. teda užívateľ môže zmeniť mestá, ale používateľ nemôže zmeniť účty. Druhý chod všetkých podmienok po únie, je chytiť všetky zmeny v user_changes
zavedená.
Je to ťažkopádne písať, a ešte viac tak, ako dotaz sa stáva komplikovaným a dopyt stavebníkov zapojiť. Tak som hľadal spôsob, ako presvedčiť sql plánovač preskočiť predikát pushdown niektorých predikáty na mojom user_changes
tabuľky bez nutnosti formát dotaz ako je táto. V ideálnom prípade s výhľadom.
PSUEDO SQL. PSUEDO SQL. PSUEDO SQL
V mojich najdivokejších snoch by som mohol povedať, dotaz, plánovač, kde ho môžete použiť na oblasť predikát, a kde sa môže používať non-oblasť 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'
Akékoľvek bláznivé nápady?