Dans cet exemple, Snowflake fait bien les choses en sautant la vue matérialisée.
Première surprise : L'analyse de la vue matérialisée est plus lente que la simple réexécution de la requête :
select *
from customer_sample_mv
order by total_sum desc nulls last
limit 100;
-- 4.4s
vs
select *
from (
select c_customer_sk,
sum(c_current_hdemo_sk) total_sum
from customer_sample
group by 1
)
order by total_sum desc nulls last
limit 100;
-- 3.6s
![enter image description here]()
Donc Snowflake gagne du temps en ne choisissant pas la vue matérialisée.
Comment cela est-il possible ?
Eh bien, il s'avère qu'il n'y a pas d'identifiant client répété. Donc les pré-grouper ne sert à rien.
select c_customer_sk, count(*) c
from customer_sample
group by 1
having c>1
order by 2 desc
limit 10;
-- null
Dans la documentation :
Même si une vue matérialisée peut remplacer la table de base dans une requête particulière, l'optimiseur peut ne pas utiliser la vue matérialisée. Par exemple, si la table de base est groupée par un champ, l'optimiseur peut choisir d'analyser la table de base (plutôt que la vue matérialisée) parce qu'il peut effectivement élaguer les partitions et fournir des performances équivalentes en utilisant la table de base.
https://docs.snowflake.com/en/user-guide/views-materialized.html#how-the-query-optimizer-uses-materialized-views