2 votes

Pourquoi Snowflake n'utilise-t-il pas ma vue matérialisée ?

Pourquoi, lorsque j'interroge ma table de base avec la requête d'agrégation suivante, Snowflake ne fait pas référence à ma MV ?

create or replace table customer_sample as (
SELECT * FROM 
"SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."CUSTOMER");

create or replace materialized view customer_sample_mv
as 
select c_customer_sk,
sum(c_current_hdemo_sk) total_sum 
from customer_sample 
group by 1;

select c_customer_sk,
sum(c_current_hdemo_sk) total_sum 
from customer_sample 
group by 1;

Profil de la requête

1voto

NickW Points 2566

Il y a beaucoup de raisons possibles, par ex.

  1. Le MV était toujours en cours de construction lorsque vous avez exécuté la requête.
  2. Snowflake a déterminé qu'il était plus rapide d'exécuter la requête sans utiliser le MV
  3. L'utilisateur qui exécute la requête n'a pas les privilèges requis sur le MV.
  4. etc.

1voto

Felipe Hoffa Points 4628

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X