Selektívne Predikát Pushdown Zobrazenie

0

Otázka

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?

1

Najlepšiu odpoveď

1

môžete pridať ďalšie stĺpce src pre určenie zdroja stôl a zábal predikáty v PRÍPADE:

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

Veľmi cool nápad! Ďakujeme!
micah

@micheáš môžete zabaliť všetky predikáty v jednom PRÍPADE pomocou A alebo ALEBO: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................