Selektivní Predikát Zásobníkových Zobrazit

0

Otázka

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?

1

Nejlepší odpověď

1

můžete přidat další sloupce src pro určení zdrojové tabulky a zabalit predikáty v PŘÍPADĚ:

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

Velmi skvělý nápad! Děkuji!!!
micah

@micah můžete zabalit všechny predikáty v jediném PŘÍPADĚ použití A nebo: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

V jiných jazycích

Tato stránka je v jiných jazycích

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