Réglage des performances avec des vues matérialiséesPerformance tune with materialized views

Les vues matérialisées du pool Synapse SQL fournissent une méthode à faible maintenance pour les requêtes analytiques complexes en vue d’obtenir des performances rapides sans aucune modification des requêtes.Materialized views in Synapse SQL pool provide a low maintenance method for complex analytical queries to get fast performance without any query change. Cet article dispense des conseils d’ordre général sur l’utilisation des vues matérialisées.This article discusses the general guidance on using materialized views.

Vues matérialisées et vues standardMaterialized views vs. standard views

Le pool SQL prend en charge les vues standard et matérialisées.SQL pool supports standard and materialized views. Les deux sont des tables virtuelles créées avec des expressions SELECT et présentées aux requêtes sous forme de tables logiques.Both are virtual tables created with SELECT expressions and presented to queries as logical tables. Les vues encapsulent la complexité du calcul de données courant et ajoutent une couche d’abstraction aux modifications de calcul si bien qu’il n’est pas nécessaire de réécrire les requêtes.Views encapsulate the complexity of common data computation and add an abstraction layer to computation changes so there's no need to rewrite queries.

Une vue standard calcule ses données chaque fois que la vue est utilisée.A standard view computes its data each time when the view is used. Aucune donnée n’est stockée sur le disque.There's no data stored on disk. L’usage veut que les vues standard soient employés en tant qu’outil permettant d’organiser les objets logiques et les requêtes dans une base de données.People typically use standard views as a tool that helps organize the logical objects and queries in a database. Pour utiliser une vue standard, une requête a besoin d’y faire référence directement.To use a standard view, a query needs to make direct reference to it.

Une vue matérialisée précalcule, stocke et conserve ses données dans le pool SQL à l'instar d'une table.A materialized view pre-computes, stores, and maintains its data in SQL pool just like a table. Aucun recalcul n’est nécessaire à chaque utilisation d’une vue matérialisée.There's no recomputation needed each time when a materialized view is used. C’est pourquoi les requêtes qui utilisent la totalité ou un sous-ensemble des données incluses dans des vues matérialisées peuvent être plus rapides.That's why queries that use all or subset of the data in materialized views can get faster performance. Mieux encore, les requêtes peuvent utiliser une vue matérialisée sans y faire référence directement. Il n’est donc pas nécessaire de modifier le code de l’application.Even better, queries can use a materialized view without making direct reference to it, so there's no need to change application code.

La plupart des exigences relatives à une vue standard s’appliquent aussi à une vue matérialisée.Most of the requirements on a standard view still apply to a materialized view. Pour plus d'informations sur la syntaxe d'une vue matérialisée et autres exigences, consultez CREATE MATERIALIZED VIEW AS SELECT.For details on the materialized view syntax and other requirements, refer to CREATE MATERIALIZED VIEW AS SELECT

ComparaisonComparison AffichageView Vue matérialiséeMaterialized View
Afficher la définitionView definition Stockée dans le pool SQL.Stored in SQL pool. Stockée dans le pool SQL.Stored in SQL pool.
Contenu de la vueView content Générée chaque fois que la vue est utilisée.Generated each time when the view is used. Prétraitée et stockée dans le pool SQL pendant sa création.Pre-processed and stored in SQL pool during view creation. Mise à jour à mesure que des données sont ajoutées aux tables sous-jacentes.Updated as data is added to the underlying tables.
Actualisation des donnéesData refresh Toujours mise à jourAlways updated Toujours mise à jourAlways updated
Vitesse pour récupérer des données de vue à partir de requêtes complexesSpeed to retrieve view data from complex queries LenteSlow RapideFast
Stockage supplémentaireExtra storage NonNo OuiYes
SyntaxeSyntax CREATE VIEWCREATE VIEW CREATE MATERIALIZED VIEW AS SELECTCREATE MATERIALIZED VIEW AS SELECT

Avantages de l’utilisation des vues matérialiséesBenefits of using materialized views

Une vue matérialisée correctement conçue offre les avantages suivants :A properly designed materialized view provides the following benefits:

  • Réduit le temps d’exécution des requêtes complexes avec des jointures et des fonctions d’agrégation.Reduce the execution time for complex queries with JOINs and aggregate functions. Plus la requête est complexe, plus le potentiel d’enregistrement au moment de l’exécution est élevé.The more complex the query, the higher the potential for execution-time saving. Le plus grand bénéfice est obtenu quand le coût de calcul d’une requête est élevé et que le jeu de données résultant est petit.The most benefit is gained when a query's computation cost is high and the resulting data set is small.
  • L'optimiseur inclus dans le pool SQL peut automatiquement utiliser les vues matérialisées déployées pour améliorer les plans d'exécution des requêtes.The optimizer in SQL pool can automatically use deployed materialized views to improve query execution plans. Ce processus est transparent pour les utilisateurs, offrant des performances plus rapides aux requêtes. De plus, il ne nécessite pas que les requêtes fassent référence directement aux vues matérialisées.This process is transparent to users providing faster query performance and doesn't require queries to make direct reference to the materialized views.
  • Peu de maintenance nécessaire sur les vues.Require low maintenance on the views. Toutes les modifications incrémentielles apportées aux données à partir des tables de base sont automatiquement ajoutées aux affichages matérialisés de manière synchrone.All incremental data changes from the base tables are automatically added to the materialized views in a synchronous manner. Cette conception permet l’interrogation des vues matérialisées pour retourner les mêmes données qu’avec une interrogation directe des tables de base.This design allows querying materialized views to return the same data as directly querying the base tables.
  • Les données comprises dans une vue matérialisée peuvent être distribuées différemment dans les tables de base.The data in a materialized view can be distributed differently from the base tables.
  • Dans les vues matérialisées, les données présentent les mêmes avantages en matière de haute disponibilité et de résilience que les données comprises dans des tables normales.Data in materialized views gets the same high availability and resiliency benefits as data in regular tables.

Les vues matérialisées implémentées dans le pool SQL offrent également les avantages supplémentaires suivants :The materialized views implemented in SQL pool also provide the following additional benefits:

En comparaison avec d’autres fournisseurs d’entrepôts de données, les vues matérialisées implémentées dans Azure Synapse Analytics offrent également les avantages supplémentaires suivants :Comparing to other data warehouse providers, the materialized views implemented in Azure Synapse Analytics also provide the following additional benefits:

Scénarios courantsCommon scenarios

Les vues matérialisées sont généralement utilisées dans les scénarios suivants :Materialized views are typically used in following scenarios:

Besoin d’améliorer les performances des requêtes analytiques complexes sur des données volumineuses en tailleNeed to improve the performance of complex analytical queries against large data in size

Les requêtes analytiques complexes utilisent généralement plus de fonctions d’agrégation et de jointures de table, ce qui entraîne plus d’opérations de calcul lourdes, comme des lectures aléatoires et des jointures dans l’exécution des requêtes.Complex analytical queries typically use more aggregation functions and table joins, causing more compute-heavy operations such as shuffles and joins in query execution. C’est pourquoi ces requêtes sont plus longues à exécuter, particulièrement sur des tables volumineuses.That's why those queries take longer to complete, specially on large tables.

Les utilisateurs peuvent créer des vues matérialisées pour les données retournées par les calculs courants des requêtes. Il n’est donc pas nécessaire de recalculer ces données pour les requêtes, ce qui permet de réduire le coût de calcul et d’accélérer la réponse des requêtes.Users can create materialized views for the data returned from the common computations of queries, so there's no recomputation needed when this data is needed by queries, allowing lower compute cost and faster query response.

Besoin de performances plus rapides sans aucune modification des requêtes ou quelques modifications minimesNeed faster performance with no or minimum query changes

Les modifications de schéma et de requête dans les pools SQL sont généralement réduites au minimum pour prendre en charge les opérations ETL standard et la création de rapports.Schema and query changes in SQL pools are typically kept to a minimum to support regular ETL operations and reporting. Les utilisateurs peuvent utiliser des vues matérialisées pour le réglage des performances des requêtes, si le coût engendré par les vues peut être compensé par le gain de performance des requêtes.People can use materialized views for query performance tuning, if the cost incurred by the views can be offset by the gain in query performance.

En comparaison à d’autres options de réglage, comme la mise à l’échelle et la gestion des statistiques, la création et la gestion d’une vue matérialisée est une modification de production à l’impact bien moindre et son gain de performance potentiel est également plus élevé.In comparison to other tuning options such as scaling and statistics management, it's a much less impactful production change to create and maintain a materialized view and its potential performance gain is also higher.

  • La création ou la gestion de vues matérialisées n’affecte pas les requêtes exécutées sur les tables de base.Creating or maintaining materialized views does not impact the queries running against the base tables.
  • L’optimiseur de requête peut utiliser automatiquement les vues matérialisées déployées sans y faire référence directement dans une requête.The query optimizer can automatically use the deployed materialized views without direct view reference in a query. Cette capacité réduit le besoin de modifier les requêtes dans le réglage des performances.This capability reduces the need for query change in performance tuning.

Besoin d’une stratégie de distribution de données différente pour des performances de requête plus rapidesNeed different data distribution strategy for faster query performance

Synapse SQL est un système de traitement de requêtes distribuées.Synapse SQL is a distributed query processing system. Les données d'une table SQL sont réparties sur 60 nœuds à l'aide de l'une des trois stratégies de distribution disponibles (hachage, tourniquet ou réplication).Data in a SQL table is distributed across 60 nodes using one of three distribution strategies (hash, round_robin, or replicated).

La distribution des données est spécifiée au moment de la création de la table et reste inchangée jusqu’à ce que la table soit supprimée.The data distribution is specified at the table creation time and stays unchanged until the table is dropped. Une vue matérialisée étant une table virtuelle sur un disque prend en charge les distributions de données en hachage et tourniquet.Materialized view being a virtual table on disk supports hash and round_robin data distributions. Les utilisateurs peuvent choisir une distribution de données qui est différente des tables de base, mais optimale pour les performances des requêtes qui utilisent le plus les vues.Users can choose a data distribution that is different from the base tables but optimal for the performance of queries that use the views most.

Guide de conceptionDesign guidance

Voici des conseils d’ordre général sur l’utilisation des vues matérialisées pour améliorer les performances des requêtes :Here is the general guidance on using materialized views to improve query performance:

Conception pour votre charge de travailDesign for your workload

Avant de commencer à créer des vues matérialisées, il est important de bien comprendre votre charge de travail en termes de modèles de requête, d’importance, de fréquence et de taille des données obtenues.Before you begin to create materialized views, it's important to have a deep understanding of your workload in terms of query patterns, importance, frequency, and the size of resulting data.

Les utilisateurs peuvent exécuter EXPLAIN WITH_RECOMMENDATIONS <Instruction_SQL> pour les vues matérialisées recommandées par l’optimiseur de requête.Users can run EXPLAIN WITH_RECOMMENDATIONS <SQL_statement> for the materialized views recommended by the query optimizer. Étant donné que ces recommandations sont propres aux requêtes, une vue matérialisée qui tire parti d’une seule requête risque de ne pas être optimale pour d’autres requêtes dans la même charge de travail.Since these recommendations are query-specific, a materialized view that benefits a single query may not be optimal for other queries in the same workload.

Évaluez ces recommandations en tenant compte des besoins de votre charge de travail.Evaluate these recommendations with your workload needs in mind. Les vues matérialisées idéales sont celles qui tirent parti des performances de la charge de travail.The ideal materialized views are those that benefit the workload's performance.

Compromis entre des requêtes plus rapides et le coûtBe aware of the tradeoff between faster queries and the cost

Pour chaque vue matérialisée, il existe un coût de stockage des données et un coût de maintenance de la vue.For each materialized view, there's a data storage cost and a cost for maintaining the view. À mesure que les données sont modifiées dans les tables de base, la taille de la vue matérialisée augmente et sa structure physique change également.As data changes in base tables, the size of the materialized view increases and its physical structure also changes. Pour éviter toute détérioration des performances de requête, le moteur du pool SQL gère séparément chaque vue matérialisée.To avoid query performance degradation, each materialized view is maintained separately by the SQL pool engine.

La charge de travail de maintenance est plus élevée quand le nombre de vues matérialisées et de modifications des tables de base augmente.The maintenance workload gets higher when the number of materialized views and base table changes increase. Les utilisateurs doivent vérifier si les coûts engendrés par toutes les vues matérialisées peuvent être compensés par le gain de performance des requêtes.Users should check if the cost incurred from all materialized views can be offset by the query performance gain.

Vous pouvez exécuter cette requête pour obtenir la liste des vues matérialisées dans une base de données :You can run this query for the list of materialized view in a database:

SELECT V.name as materialized_view, V.object_id
FROM sys.views V
JOIN sys.indexes I ON V.object_id= I.object_id AND I.index_id < 2;

Options pour réduire le nombre de vues matérialisées :Options to reduce the number of materialized views:

  • Identifiez les jeux de données courants fréquemment utilisés par les requêtes complexes dans votre charge de travail.Identify common data sets frequently used by the complex queries in your workload. Créez des vues matérialisées pour stocker ces jeux de données afin que l’optimiseur puisse les utiliser en tant que composants lors de la création de plans d’exécution.Create materialized views to store those data sets so the optimizer can use them as building blocks when creating execution plans.

  • Supprimez les vues matérialisées peu utilisées ou devenues inutiles.Drop the materialized views that have low usage or are no longer needed. Une vue matérialisée désactivée ne fait pas l’objet d’une maintenance, mais elle induit toujours un coût de stockage.A disabled materialized view is not maintained but it still incurs storage cost.

  • Combinez des vues matérialisées créées sur des tables de base identiques ou similaires, même si leurs données ne se chevauchent pas.Combine materialized views created on the same or similar base tables even if their data doesn't overlap. La combinaison de vues matérialisées peut créer une taille plus grande que la somme des tailles de chaque vue, mais le coût de leur maintenance s’en retrouve réduit.Combining materialized views could result in a larger view in size than the sum of the separate views, however the view maintenance cost should reduce. Par exemple :For example:


-- Query 1 would benefit from having a materialized view created with this SELECT statement

SELECT A, SUM(B)
FROM T
GROUP BY A

-- Query 2 would benefit from having a materialized view created with this SELECT statement

SELECT C, SUM(D)
FROM T
GROUP BY C

-- You could create a single mateiralized view of this form

SELECT A, C, SUM(B), SUM(D)
FROM T
GROUP BY A, C

Tous les réglages des performances n’ont pas besoin de modification des requêtesNot all performance tuning requires query change

L'optimiseur du pool SQL peut automatiquement utiliser des vues matérialisées déployées pour améliorer les performances des requêtes.The SQL pool optimizer can automatically use deployed materialized views to improve query performance. Cette prise en charge s’applique en toute transparence aux requêtes qui ne font pas référence aux vues et aux requêtes qui utilisent des agrégats non pris en charge dans la création de vues matérialisées.This support is applied transparently to queries that don't reference the views and queries that use aggregates unsupported in materialized views creation. Aucune modification de requête n’est nécessaire.No query change is needed. Vous pouvez vérifier le plan d’exécution estimé d’une requête pour confirmer si une vue matérialisée est utilisée.You can check a query's estimated execution plan to confirm if a materialized view is used.

Superviser les vues matérialiséesMonitor materialized views

Une vue matérialisée est stockée dans le pool SQL de la même manière qu'une table avec un index columnstore en cluster.A materialized view is stored in the SQL pool just like a table with clustered columnstore index (CCI). La lecture de données à partir d’une vue matérialisée inclut une analyse des segments de l’index columnstore cluster et l’application des modifications incrémentielles des tables de base.Reading data from a materialized view includes scanning the CCI index segments and applying any incremental changes from base tables. Quand le nombre de modifications incrémentielles est trop élevé, la résolution d’une requête à partir d’une vue matérialisée peut prendre plus de temps que l’interrogation directe des tables de base.When the number of incremental changes is too high, resolving a query from a materialized view can take longer than directly querying the base tables.

Pour éviter toute détérioration des performances de requête, il est recommandé d'exécuter DBCC PDW_SHOWMATERIALIZEDVIEWOVERHEAD pour superviser la valeur overhead_ratio (total_rows / max(1, base_view_row)) de la vue.To avoid query performance degradation, it's a good practice to run DBCC PDW_SHOWMATERIALIZEDVIEWOVERHEAD to monitor the view's overhead_ratio (total_rows / max(1, base_view_row)). Les utilisateurs doivent RÉGÉNÉRER la vue matérialisée si sa valeur overhead_ratio est trop élevée.Users should REBUILD the materialized view if its overhead_ratio is too high.

Vue matérialisée et mise en cache du jeu de résultatsMaterialized view and result set caching

Ces deux fonctionnalités sont introduites dans le pool SQL à peu près en même temps à des fins de réglage des performances des requêtes.These two features are introduced in SQL pool around the same time for query performance tuning. La mise en cache du jeu de résultats est utilisée pour obtenir une concurrence élevée et une réponse rapide des requêtes répétitives sur des données statiques.Result set caching is used for getting high concurrency and fast response from repetitive queries against static data.

Pour utiliser le résultat mis en cache, la forme de la requête de cache doit correspondre à la requête qui a produit le cache.To use the cached result, the form of the cache requesting query must match with the query that produced the cache. De plus, le résultat mis en cache doit s’appliquer à la requête entière.In addition, the cached result must apply to the entire query.

Les vues matérialisées permettent de modifier les données dans les tables de base.Materialized views allow data changes in the base tables. Les données des vues matérialisées peuvent être appliquées à une partie d’une requête.Data in materialized views can be applied to a piece of a query. Cette prise en charge permet à des requêtes différentes, qui partagent des calculs à des fins d’accélération des performances, d’utiliser les mêmes vues matérialisées.This support allows the same materialized views to be used by different queries that share some computation for faster performance.

ExempleExample

Cet exemple utilise une requête de type TPCDS qui recherche les clients qui dépensent plus d’argent par le biais du catalogue que dans les magasins, afin d’identifier les clients préférés et leur pays/région d’origine.This example uses a TPCDS-like query that finds customers who spend more money via catalog than in stores, identify the preferred customers and their country/region of origin. La requête consiste à sélectionner les 100 premiers enregistrements issus de l’instruction UNION de trois sous-instructions SELECT impliquant les fonctions SUM() et GROUP BY.The query involves selecting TOP 100 records from the UNION of three sub-SELECT statements involving SUM() and GROUP BY.

WITH year_total AS (
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt+ss_ext_sales_price, 0)/2) year_total
       ,'s' sale_type
FROM customer
     ,store_sales
     ,date_dim
WHERE c_customer_sk = ss_customer_sk
   AND ss_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year
UNION ALL
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(cs_ext_list_price-cs_ext_wholesale_cost-cs_ext_discount_amt+cs_ext_sales_price, 0)/2) year_total
       ,'c' sale_type
FROM customer
     ,catalog_sales
     ,date_dim
WHERE c_customer_sk = cs_bill_customer_sk
   AND cs_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year
UNION ALL
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(ws_ext_list_price-ws_ext_wholesale_cost-ws_ext_discount_amt+ws_ext_sales_price, 0)/2) year_total
       ,'w' sale_type
FROM customer
     ,web_sales
     ,date_dim
WHERE c_customer_sk = ws_bill_customer_sk
   AND ws_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year
         )
  SELECT TOP 100
                  t_s_secyear.customer_id
                 ,t_s_secyear.customer_first_name
                 ,t_s_secyear.customer_last_name
                 ,t_s_secyear.customer_birth_country
FROM year_total t_s_firstyear
     ,year_total t_s_secyear
     ,year_total t_c_firstyear
     ,year_total t_c_secyear
     ,year_total t_w_firstyear
     ,year_total t_w_secyear
WHERE t_s_secyear.customer_id = t_s_firstyear.customer_id
   AND t_s_firstyear.customer_id = t_c_secyear.customer_id
   AND t_s_firstyear.customer_id = t_c_firstyear.customer_id
   AND t_s_firstyear.customer_id = t_w_firstyear.customer_id
   AND t_s_firstyear.customer_id = t_w_secyear.customer_id
   AND t_s_firstyear.sale_type = 's'
   AND t_c_firstyear.sale_type = 'c'
   AND t_w_firstyear.sale_type = 'w'
   AND t_s_secyear.sale_type = 's'
   AND t_c_secyear.sale_type = 'c'
   AND t_w_secyear.sale_type = 'w'
   AND t_s_firstyear.dyear+0 =  1999
   AND t_s_secyear.dyear+0 = 1999+1
   AND t_c_firstyear.dyear+0 =  1999
   AND t_c_secyear.dyear+0 =  1999+1
   AND t_w_firstyear.dyear+0 = 1999
   AND t_w_secyear.dyear+0 = 1999+1
   AND t_s_firstyear.year_total > 0
   AND t_c_firstyear.year_total > 0
   AND t_w_firstyear.year_total > 0
   AND CASE WHEN t_c_firstyear.year_total > 0 THEN t_c_secyear.year_total / t_c_firstyear.year_total ELSE NULL END
           > CASE WHEN t_s_firstyear.year_total > 0 THEN t_s_secyear.year_total / t_s_firstyear.year_total ELSE NULL END
   AND CASE WHEN t_c_firstyear.year_total > 0 THEN t_c_secyear.year_total / t_c_firstyear.year_total ELSE NULL END
           > CASE WHEN t_w_firstyear.year_total > 0 THEN t_w_secyear.year_total / t_w_firstyear.year_total ELSE NULL END
ORDER BY t_s_secyear.customer_id
         ,t_s_secyear.customer_first_name
         ,t_s_secyear.customer_last_name
         ,t_s_secyear.customer_birth_country
OPTION ( LABEL = 'Query04-af359846-253-3');

Vérifiez le plan d’exécution estimé de la requête.Check the query's estimated execution plan. Il y a 18 lectures aléatoires et 17 opérations de jointure, dont l’exécution prend plus de temps.There are 18 shuffles and 17 joins operations, which take more time to execute. Créons maintenant une vue matérialisée pour chacune des trois sous-instructions SELECT.Now let's create one materialized view for each of the three sub-SELECT statements.

CREATE materialized view nbViewSS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt+ss_ext_sales_price, 0)/2) year_total
          , count_big(*) AS cb
FROM dbo.customer
     ,dbo.store_sales
     ,dbo.date_dim
WHERE c_customer_sk = ss_customer_sk
   AND ss_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year
GO
CREATE materialized view nbViewCS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(cs_ext_list_price-cs_ext_wholesale_cost-cs_ext_discount_amt+cs_ext_sales_price, 0)/2) year_total
          , count_big(*) as cb
FROM dbo.customer
     ,dbo.catalog_sales
     ,dbo.date_dim
WHERE c_customer_sk = cs_bill_customer_sk
   AND cs_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year

GO
CREATE materialized view nbViewWS WITH (DISTRIBUTION=HASH(customer_id)) AS
SELECT c_customer_id customer_id
       ,c_first_name customer_first_name
       ,c_last_name customer_last_name
       ,c_preferred_cust_flag customer_preferred_cust_flag
       ,c_birth_country customer_birth_country
       ,c_login customer_login
       ,c_email_address customer_email_address
       ,d_year dyear
       ,sum(isnull(ws_ext_list_price-ws_ext_wholesale_cost-ws_ext_discount_amt+ws_ext_sales_price, 0)/2) year_total
          , count_big(*) AS cb
FROM dbo.customer
     ,dbo.web_sales
     ,dbo.date_dim
WHERE c_customer_sk = ws_bill_customer_sk
   AND ws_sold_date_sk = d_date_sk
GROUP BY c_customer_id
         ,c_first_name
         ,c_last_name
         ,c_preferred_cust_flag
         ,c_birth_country
         ,c_login
         ,c_email_address
         ,d_year

Revérifiez le plan d’exécution de la requête d’origine.Check the execution plan of the original query again. À présent, le nombre de jointures passe de 17 à 5 et il n’y a plus de lecture aléatoire.Now the number of joins changes from 17 to 5 and there's no shuffle anymore. Cliquez sur l’icône de filtrage de l’opération dans le plan, sa liste de sortie indique que les données sont lues à partir des vues matérialisées et non des tables de base.Click the Filter operation icon in the plan, its Output List shows the data is read from the materialized views instead of base tables.

Plan_Output_List_with_Materialized_Views

Avec les vues matérialisées, la même requête s’exécute beaucoup plus rapidement sans aucune modification de code.With materialized views, the same query runs much faster without any code change.

Étapes suivantesNext steps

Pour obtenir des conseils supplémentaires en matière de développement, consultez Présentation du développement d'un pool Synapse SQL.For more development tips, see Synapse SQL pool development overview.