Seçici Yüklem Pushdown Görüntülemek İçin

0

Soru

Sık güncellemeler alan büyük bir sütun deposu tablom var. Güncellemeleri doğrudan kaynak tabloya almıyorum çünkü bu, çoğu durumda, az sayıda güncellemenin tam bir tablo mikro bölümünün yeniden oluşturulmasına neden olmasına neden olur. Bunun yerine güncellemeleri bir güncelleme tablosuna aktarıyorum ve sorgu zamanında her ikisini de birleştiriyorum. Pratikte bu iyi sonuç verir.

Bu yüzden işleri basitleştirin, bunu bir görünüme atacağım 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
)

Hem users masa ve user_changes tablo, bazı bölüm yapılandırmasının yanı sıra aynı şemaya sahiptir. Bu şekilde, yalnızca doğru bölümdeki kullanıcıları seçmek için görünümdeki yüklem pushdown'ı kullanabilirim. Diyelim ki bu account_id.

SELECT * FROM users_view
WHERE account_id = 1234

Ama users tablo, tablodan biraz daha büyüktür. user_changes tablo ve daha fazla yüklemi aşağıya itmek istiyorum users ek yüklemleri aşağıya itmeden tablo user_changes masa. Niçin? Çünkü üzerinde eşleştirme users tablo, %98 doğru olsa da, yanlış pozitif / negatiflere sahiptir. Ayrıntılar user_changes rekoru düzeltmek için gereklidir. Bunun bir görünümün dışında nasıl görüneceği şudur::

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'

Bu göründüğü kadar kötü olarak, çok daha fazla ölçülebilir bir şey. Tüm koşullar çok daha büyük olanlara uygulanabilir users tablo, ancak yalnızca değişmeyen koşullara uygulanabilir users_changes masa. yani bir kullanıcı şehirleri değiştirebilir, ancak bir kullanıcı hesapları değiştiremez. Sendikadan sonraki tüm koşulların ikinci koşusu, herhangi bir değişikliği yakalamaktır. user_changes tanıtıldı.

Bu, yazmak için hantaldır ve sorgu karmaşıklaştıkça ve sorgu oluşturucuları dahil olduğunda daha da fazladır. Bu yüzden sql planlayıcısını, bazı yüklemlerin yüklemlerini atlamaya ikna etmenin bir yolunu arıyorum. user_changes sorguyu bu şekilde biçimlendirmeye gerek kalmadan tablo. İdeal olarak manzaralı.

PSUEDO SQL. PSUEDO SQL. PSUEDO SQLNAME of TRANSLATORS

En çılgın rüyalarımda sorgu planlayıcısına bölüm yüklemlerini nerede kullanabileceğini ve bölüm dışı yüklemleri nerede kullanabileceğini söyleyebilirim.

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'

Herhangi bir çılgın fikir?

1

En iyi cevabı

1

ek sütun ekleyebilirsiniz src durumda kaynak tablo ve sarma yüklemlerini belirlemek için:

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

Çok güzel fikir! Teşekkürler!
micah

@micah tüm yüklemleri AND veya OR kullanarak tek bir durumda sarabilirsiniz.: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

Diğer dillerde

Bu sayfa diğer dillerde

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