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?