Événements
31 mars, 23 h - 2 avr., 23 h
Le plus grand événement d’apprentissage SQL, Fabric et Power BI. 31 mars au 2 avril. Utilisez le code FABINSIDER pour économiser 400 $.
Inscrivez-vous aujourd’huiCe navigateur n’est plus pris en charge.
Effectuez une mise à niveau vers Microsoft Edge pour tirer parti des dernières fonctionnalités, des mises à jour de sécurité et du support technique.
S’applique à : SQL Server
Azure SQL Database
Azure SQL Managed Instance
Analytics Platform System (PDW)
Base de données SQL dans Microsoft Fabric
Cet article vous aide à déterminer quand et comment effectuer la maintenance des index. Il aborde des concepts tels que la fragmentation d’index et la densité de page, ainsi que leur impact sur les performances des requêtes et la consommation des ressources. Il décrit les méthodes de maintenance d’index, la réorganisation d’un index et la reconstruction d’un index, et suggère une stratégie de maintenance d’index qui équilibre les améliorations potentielles des performances par rapport à la consommation de ressources requise pour la maintenance.
Notes
Cet article ne s’applique pas non plus à un pool SQL dédié dans Azure Synapse Analytics. Pour plus d’informations sur la maintenance des index dans un pool SQL dédié dans Azure Synapse Analytics, consultez Indexer les tables d’un pool SQL dédié dans Azure Synapse Analytics.
Présentation de la fragmentation d’index et de son impact sur les performances :
Dans les index de type Arbre B (rowstore), la fragmentation intervient lorsque des index possèdent des pages dans lesquelles l’organisation logique au sein de l’index (reposant sur les valeurs de clés de celui-ci) ne correspond pas à l’organisation physique des pages d’index.
Notes
De manière générale, la documentation SQL Server utilise le terme B-tree en référence aux index. Dans les index rowstore, le moteur de base de données implémente une structure B+. Cela ne s’applique pas aux index columnstore ou aux index sur les tables à mémoire optimisée. Pour plus d’informations, consultez le Guide de conception et d’architecture d’index SQL Server et Azure SQL.
Le moteur de base de données modifie automatiquement des index quand des opérations d’insertion, de mise à jour ou de suppression sont effectuées sur les données sous-jacentes. Par exemple, l’ajout de lignes dans une table peut entraîner le fractionnement des pages existantes dans les index rowstore afin de libérer de l’espace pour l’insertion de nouvelles lignes. Au fil des modifications, les données figurant dans l'index sont éparpillées dans la base de données (fragmentée).
Pour les requêtes qui lisent de nombreuses pages à l’aide d’analyses d’index complètes ou de plages, les index fortement fragmentés peuvent dégrader les performances des requêtes quand des demandes d’E/S supplémentaires sont nécessaires pour lire les données. Au lieu d’un petit nombre de demandes d’E/S volumineuses, la requête requiert un plus grand nombre de demandes d’E/S peu volumineuses pour lire la même quantité de données.
Lorsque le sous-système de stockage offre de meilleures performances d’E/S séquentielles que les performances d’E/S aléatoires, la fragmentation d’index peut dégrader les performances, car des E/S aléatoires sont nécessaires pour lire les index fragmentés.
Qu’est-ce que la densité de page (également appelée remplissage de la page) et comment influe-t-elle sur les performances ?
Conseil
Dans de nombreuses charges de travail, l’augmentation de la densité de page entraîne un impact positif sur les performances par rapport à la réduction de la fragmentation.
Pour éviter de réduire la densité de page inutilement, Microsoft déconseille de définir un facteur de remplissage sur des valeurs autres que 100 ou 0, sauf dans certains cas où les index présentent un grand nombre de fractionnements de pages, par exemple les index fréquemment modifiés avec des colonnes de début contenant des valeurs GUID non séquentielles.
La fragmentation et la densité de page font partie des facteurs à prendre en compte pour décider s’il faut effectuer la maintenance d’index, ainsi que la méthode de maintenance à utiliser.
La fragmentation est définie différemment pour les index rowstore et columnstore. Pour les index rowstore, sys.dm_db_index_physical_stats vous permet de déterminer la fragmentation et la densité de page dans un index spécifique, dans tous les index d’une table ou d’une vue indexée, dans tous les index d’une base de données, ou dans tous les index de l’ensemble des bases de données. Pour les index partitionnés, sys.dm_db_index_physical_stats()
fournit aussi ces informations pour chaque partition.
Le jeu de résultats renvoyé par sys.dm_db_index_physical_stats
inclut les colonnes suivantes :
Colonne | Description |
---|---|
avg_fragmentation_in_percent |
Fragmentation logique (pages non ordonnées dans un index). |
avg_page_space_used_in_percent |
Densité de page moyenne. |
Pour les groupes de lignes compressés dans les index de columnstore, la fragmentation est définie comme le rapport entre les lignes supprimées et le nombre total de lignes, exprimé en pourcentage. sys.dm_db_column_store_row_group_physical_stats vous permet de déterminer le nombre de lignes totales et supprimées par groupe de lignes dans un index spécifique, tous les index d’une table, ou tous les index d’une base de données.
Le jeu de résultats renvoyé par sys.dm_db_column_store_row_group_physical_stats
inclut les colonnes suivantes :
Colonne | Description |
---|---|
total_rows |
Nombre de lignes stockées physiquement dans le groupe de lignes. Pour les groupes de lignes compressés, cela comprend les lignes qui sont marquées comme supprimées. |
deleted_rows |
Nombre de lignes physiquement stockées dans un groupe de lignes compressé marqué pour suppression. 0 pour les groupes de lignes qui se trouvent dans le delta store. |
La fragmentation des groupes de lignes compressés dans un index columnstore peut être calculée à l’aide de la formule suivante :
100.0*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
Conseil
Pour les index rowstore et columnstore, examinez la fragmentation de l’index ou du segment de mémoire et la densité des pages après la suppression ou la mise à jour d’un grand nombre de lignes. Pour les segments de mémoire, en cas de mises à jour fréquentes, examinez régulièrement la fragmentation pour éviter la prolifération des enregistrements de transfert. Pour plus d’informations sur les segments de mémoire, consultez Segments de mémoire (tables sans index cluster).
Consultez des exemples de requêtes pour déterminer la fragmentation et la densité de page.
Vous pouvez réduire la fragmentation de l’index et augmenter la densité de page à l’aide de l’une des méthodes suivantes :
Notes
Dans le cas d’index partitionnés, vous pouvez utiliser les méthodes suivantes sur la totalité des partitions ou sur une partition unique d’un index.
La réorganisation d’un index est moins gourmande en ressources que la reconstruction d’un index. Pour cette raison, ce doit être votre méthode de maintenance d’index par défaut, à moins qu’il y ait une raison spécifique d’utiliser la reconstruction d’index. La réorganisation est toujours une opération en ligne. En d’autres termes, les verrous à long terme au niveau de l’objet ne sont pas conservés, ce qui permet aux requêtes et aux mises à jour de la table sous-jacente de se poursuivre pendant l’opération ALTER INDEX ... REORGANIZE
.
Notes
À partir de SQL Server 2019 (15.x), Azure SQL Database, Azure SQL Managed Instance et le moteur de tuple est aidé par une tâche de fusion en arrière-plan qui compresse automatiquement les rowgroups delta OPEN plus petits qui existent depuis un certain temps, tel que déterminé par un seuil interne, ou qui fusionne les rowgroups compressés à partir desquels un grand nombre de lignes a été supprimé. Cela améliore la qualité de l’index columnstore dans le temps. Dans la plupart des cas, cela permet d’éviter l’exécution des commandes ALTER INDEX ... REORGANIZE
.
Conseil
Si vous annulez une opération de réorganisation ou si elle est interrompue, la progression atteinte à ce point est conservée dans la base de données. Pour réorganiser des index volumineux, l’opération peut être démarrée et arrêtée plusieurs fois jusqu’à ce qu’elle se termine.
La reconstruction d'un index entraîne sa suppression puis sa recréation. En fonction du type d’index et de la version de Moteur de base de données, une opération de reconstruction peut être effectuée hors connexion ou en ligne. Une reconstruction hors connexion prend généralement moins de temps qu’une reconstruction en ligne, mais elle détient des verrous au niveau de l’objet pendant toute la durée de l’opération de reconstruction, bloquant ainsi les requêtes d’accès à la table ou à la vue
Une reconstruction d’index en ligne ne nécessite pas de verrous au niveau de l’objet jusqu’à la fin de l’opération, moment où un verrou doit être brièvement maintenu pour terminer la reconstruction. Selon la version du Moteur de base de données, une régénération d’index en ligne peut être démarrée en tant qu’opération pouvant être reprise. Une reconstruction d’index pouvant être reprise peut être suspendue, ce qui conserve la progression atteinte à ce point. Une opération de reconstruction peut être reprise après avoir été suspendue ou interrompue, ou abandonnée si l’exécution de la reconstruction devient inutile.
Pour la syntaxe Transact-SQL, consultez ALTER INDEX REBUILD. Pour plus d’informations sur les reconstructions d’index en ligne, consultez Exécuter des opérations en ligne sur les index.
Notes
Pendant la reconstruction d’un index en ligne, chaque modification de données dans des colonnes indexées doit mettre à jour une copie supplémentaire de l’index. Cela peut entraîner une dégradation mineure des performances des instructions de modification de données pendant la reconstruction en ligne.
Si une opération d’index en ligne pouvant être reprise est suspendue, cet impact sur les performances persiste jusqu’à ce que l’opération pouvant être reprise soit terminée ou abandonnée. Si vous n’envisagez pas de terminer une opération d’index pouvant être reprise, abandonnez-la au lieu de la suspendre.
Conseil
En fonction des ressources disponibles et des modèles de charge de travail, spécifier une valeur supérieure à la valeur par défaut MAXDOP
dans l’instruction ALTER INDEX REBUILD permet d’accélérer la reconstruction, mais au détriment d’une augmentation des ressources processeur.
Pour les index rowstore, la reconstruction supprime la fragmentation à tous les niveaux de l’index et compacte les pages en fonction du facteur de remplissage spécifié ou actuel. Si ALL
est précisé, tous les index sur la table sont supprimés puis reconstruits en une seule opération. Lorsque de la reconstruction d’index contenant au moins 128 étendues, le moteur de base de données diffère les désallocations de pages et l’acquisition des verrous qui y sont associés jusqu’à ce que la reconstruction soit terminée. Pour obtenir des exemples de syntaxe, consultez Exemples : reconstruction d’index rowstore.
Pour les index columnstore, la reconstruction supprime la fragmentation, déplace toutes les lignes du delta store dans columnstore, et supprime physiquement les lignes qui ont été marquées pour suppression. Pour obtenir des exemples de syntaxe, consultez Exemples : reconstruction d’index columnstore.
Conseil
À partir de SQL Server 2016 (13.x), la régénération de l’index columnstore n’est généralement pas nécessaire, car REORGANIZE
effectue l’essentiel de la régénération sous la forme d’une opération en ligne.
Avant SQL Server 2008 (10.0.x), vous aviez parfois la possibilité de reconstruire un index non cluster de lignes afin de corriger les incohérences dues à des données corrompues dans l’index.
Vous pouvez toujours réparer de telles incohérences dans l’index non cluster en reconstruisant un index non cluster hors connexion. Toutefois, vous ne pouvez pas réparer les incohérences d’un index non cluster en reconstruisant l’index en ligne. En effet, le mécanisme de reconstruction en ligne utilise l’index non cluster existant comme base pour la reconstruction et propage de ce fait l’incohérence. La reconstruction de l’index hors connexion peut parfois forcer une analyse de l’index cluster (ou du segment de mémoire). Par conséquent, remplacez les données incohérentes dans l’index non cluster par les données de l’index cluster ou du segment de mémoire.
Pour vous assurer que l’index cluster ou le segment de mémoire est utilisé comme source de données, supprimez et recréez l’index non cluster au lieu de le reconstruire. Comme pour les versions antérieures, vous pouvez récupérer à partir d’incohérences en restaurant les données affectées à l’aide d’une sauvegarde. Toutefois, vous pourrez peut-être réparer les incohérences d’un index non cluster en le générant à nouveau hors connexion ou en le recréant. Pour plus d’informations, consultez DBCC CHECKDB (Transact-SQL).
Tirez parti de solutions comme Adaptive Index Defrag pour gérer automatiquement la fragmentation des index et les mises à jour des statistiques pour une ou plusieurs bases de données. Cette procédure choisit automatiquement s’il faut reconstruire ou réorganiser un index en fonction de son niveau de fragmentation, entre autres, et mettre à jour les statistiques avec un seuil linéaire.
Les scénarios suivants entraînent la reconstruction automatique de tous les index non cluster rowstore sur une table :
CREATE CLUSTERED INDEX ... WITH (DROP_EXISTING = ON)
Les scénarios suivants ne reconstruisent pas automatiquement tous les index non cluster rowstore sur la même table :
Important
Un index ne peut pas être réorganisé ou régénéré si le groupe de fichiers dans lequel il se trouve est hors connexion ou en lecture seule. Si le mot clé ALL est spécifié et que des index se trouvent dans un groupe de fichiers hors connexion ou en lecture seule, l'instruction échoue.
En cas de régénération d’un index, le média physique doit avoir suffisamment d’espace pour stocker deux copies de l’index. Lorsque la regénération est terminée, le moteur de base de données supprime l’index d’origine.
Si ALL
est spécifié avec l’instruction ALTER INDEX ... REORGANIZE
, les index cluster, non cluster et XML de la table sont réorganisés.
Généralement, la régénération ou la réorganisation de petits index rowstore ne réduit pas la fragmentation. Jusqu’à SQL Server 2014 (12.x) compris, le moteur de base de données SQL Server alloue de l’espace à l’aide d’étendues mixtes. Par conséquent, les pages de petits index sont parfois stockées sur des extensions mixtes, ce qui fragmente implicitement ces index. Les extensions mixtes sont partagées par huit objets maximum ; par conséquent, la fragmentation dans un petit index peut ne pas être réduite après sa réorganisation ou sa reconstruction.
Lors de la regénération d’un index columnstore, le moteur de base de données lit toutes les données de l’index columnstore d’origine, dont le delta store. Il combine les données dans de nouveaux groupes de lignes et compresse tous les groupes de lignes dans columnstore. Le moteur de base de données défragmente le columnstore en supprimant physiquement les lignes qui ont été marquées comme supprimées.
Notes
À partir de SQL Server 2019 (15.x), le moteur de tuple est aidé par une tâche de fusion en arrière-plan qui compresse automatiquement les groupes storerow ouverts plus petits du delta store qui existent depuis un certain temps, tel que déterminé par un seuil interne, ou qui fusionne les groupes de lignes compressés où un grand nombre de lignes a été supprimé. Cela améliore la qualité de l’index columnstore dans le temps. Pour plus d'informations sur les termes et les concepts columnstore, consultez Index Columnstore : vue d'ensemble.
Reconstruire un index columnstore cluster entier prend beaucoup de temps si l'index est volumineux, et cela nécessite suffisamment d'espace disque pour stocker une copie supplémentaire de la totalité de l’index pendant la reconstruction.
Pour les tables partitionnées, vous n’avez pas besoin de reconstruire tout l’index columnstore si la fragmentation est présente uniquement dans certaines partitions, par exemple dans les partitions où les instructions UPDATE
, DELETE
ou MERGE
ont affecté un grand nombre de lignes.
La reconstruction d’une partition après le chargement ou la modification des données garantit que toutes les données sont stockées dans des groupes de lignes compressés dans columnstore. Lorsque le processus de chargement des données insère des données dans une partition en utilisant des lots inférieurs à 102 400 lignes, la partition peut se retrouver avec plusieurs groupes de lignes ouverts dans le delta store. La reconstruction déplace toutes les lignes du delta store dans des groupes de lignes compressés dans columnstore.
Lors de la réorganisation d’un index columnstore, le moteur de base de données compresse chaque groupe de ligne du delta store dans le columnstore en tant que groupe de lignes compressé. À partir de SQL Server 2016 (13.x) et dans Azure SQL Database, la commande REORGANIZE
effectue les optimisations de défragmentation supplémentaires suivantes en ligne :
Après avoir exécuté des charges de données, vous pouvez avoir plusieurs petits groupes de lignes dans le delta store. Vous pouvez utiliser ALTER INDEX REORGANIZE
pour forcer ces groupes de lignes dans columnstore, puis combiner des groupes de lignes compressés plus petits dans des groupes de lignes compressés plus volumineux. L’opération de réorganisation supprimera également les lignes qui ont été marquées comme supprimées du columnstore.
Notes
La réorganisation d’un index columnstore à l’aide de Management Studio combine les groupes de lignes compressés ensemble, mais ne force pas tous les groupes de lignes à être compressés dans le columnstore. Les groupes de lignes fermés sont compressés, mais les groupes de lignes ouverts ne sont pas compressés dans le columnstore.
Pour compresser de force tous les groupes de lignes, utilisez l’exemple Transact-SQL qui inclut COMPRESS_ALL_ROW_GROUPS = ON
.
La maintenance d’un index, effectuée par la réorganisation ou la reconstruction d’un index, est gourmande en ressources. Cela entraîne une augmentation significative des ressources processeur, de la mémoire utilisée et des E/S de stockage. Toutefois, en fonction de la charge de travail de la base de données et d’autres facteurs, les avantages qu’elle apporte vont d’une importance cruciale à un impact minime.
Pour éviter une utilisation inutile des ressources, évitez d’effectuer des maintenances d’index sans discernement. Au lieu de cela, les avantages de la maintenance d’index doivent être déterminés de façon empirique pour chaque charge de travail à l’aide de la stratégie recommandée, et doivent être pondérés par rapport aux coûts des ressources et l’impact sur la charge de travail nécessaire pour bénéficier de tels avantages.
La probabilité d’obtenir des avantages en termes de performances en réorganisant ou en reconstruisant un index est plus élevée lorsque l’index est fortement fragmenté ou lorsque sa densité de page est faible. Mais ce ne sont pas les seuls éléments à prendre en compte. Des facteurs tels que les modèles de requête (traitement des transactions par opposition à l'analyse et à la production de rapports), le comportement du sous-système de stockage, la mémoire disponible et les améliorations du moteur de base de données au fil du temps jouent tous un rôle.
Important
Les décisions relatives à la maintenance de l'indexe doivent être prises en tenant compte de multiples facteurs dans le contexte spécifique de chaque charge de travail, y compris le coût en ressources de la maintenance. Elles ne doivent pas reposer uniquement sur des seuils de fragmentation fixe ou de densité de page.
Les clients observent souvent une amélioration des performances après la reconstruction des index. Mais dans de nombreux cas, ces améliorations ne sont pas liées à la réduction de la fragmentation ni à l’amélioration de la densité de page.
Une reconstruction d’index présente un avantage important : elle met à jour les statistiques sur les colonnes clés de l’index en analysant toutes les lignes de l’index. Cela équivaut à exécuter UPDATE STATISTICS ... WITH FULLSCAN
, qui actualise les statistiques et, parfois, améliore leur qualité par rapport à la mise à jour des statistiques échantillonnée par défaut. Lorsque les statistiques sont mises à jour, les plans de requête qui les référencent sont recompilés. Si le plan précédent d’une requête n’était pas optimal en raison de statistiques obsolètes, d’un taux d'échantillonnage insuffisant des statistiques, ou pour d’autres raisons, le plan recompilé sera souvent plus performant.
Les clients attribuent souvent à tort cette amélioration à la reconstruction de l’index elle-même, la considérant comme le résultat de la réduction de la fragmentation et de l'augmentation de la densité de page. En réalité, le même avantage peut souvent être obtenu à un coût de ressources beaucoup plus faible, en mettant à jour les statistiques au lieu de reconstruire les index.
Conseil
Le coût en ressources de la mise à jour des statistiques est mineur par rapport à la reconstruction de l’index, et l’opération se termine souvent en quelques minutes. Les reconstructions d’index peuvent prendre plusieurs heures.
Microsoft recommande aux clients de considérer et d’adopter la stratégie de maintenance d’index suivante :
WITH SAMPLE ... PERCENT
ou WITH FULLSCAN
(dans de rares cas).En plus des considérations et de la stratégie ci-dessus, dans Azure SQL Database et Azure SQL Managed Instance, il est particulièrement important de considérer les coûts et les avantages de la maintenance d’index. Les clients ne doivent l’effectuer qu’en cas de besoin avéré, et en tenant compte des points suivants.
Il existe des scénarios spécifiques, mais peu fréquents, dans lesquels une maintenance ponctuelle ou périodique de l’index peut être nécessaire dans Azure SQL Database et Azure SQL Managed Instance :
Conseil
Si vous avez déterminé qu’une maintenance d’index est nécessaire pour vos charges de travail Azure SQL Database et Azure SQL Managed Instance, vous devez soit réorganiser les index, soit utiliser la reconstruction d’index en ligne. Cela permet aux charges de travail de requêtes d’accéder aux tables pendant la reconstruction des index.
En outre, le fait de pouvoir reprendre l’opération vous permet d’éviter de la relancer depuis le début si elle est interrompue par un basculement planifié ou non de la base de données. L’utilisation d’opérations d’index pouvant être reprises est particulièrement importante lorsque les index sont volumineux.
Conseil
Les opérations d’index hors connexion sont généralement plus rapides que les opérations en ligne. Elles doivent être utilisées lorsque les tables ne seront pas interrogées par des requêtes pendant l’opération, par exemple après le chargement de données dans des tables de transit dans le cadre d’un processus ETL séquentiel.
Les index rowstore possédant plus de 128 extensions sont régénérés en deux phases distinctes : une phase logique et une phase physique. Dans la phase logique, les unités d'allocation utilisées par l'index sont signalées comme devant être désallouées, les lignes de données sont copiées et triées, puis elles sont déplacées vers les nouvelles unités d'allocation ayant été créées pour stocker l'index reconstruit. Dans la phase physique, les unités d'allocation préalablement signalées pour être désallouées sont supprimées physiquement dans des transactions courtes qui interviennent en arrière-plan et nécessitent peu de verrous. Pour plus d’informations sur les unités d'allocation, consultez Guide d’architecture des pages et des étendues.
L’instruction ALTER INDEX REORGANIZE
a besoin du fichier de données contenant l’index pour disposer d’espace, car l’opération peut uniquement allouer des pages de travail temporaires sur le même fichier, et non dans un autre fichier du même groupe de fichiers. Même si le groupe de fichiers dispose d’espace libre, l’utilisateur peut rencontrer l’erreur 1105 : Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup
pendant l’opération de réorganisation si un fichier de données manque d’espace.
Un index ne peut pas être réorganisé lorsque ALLOW_PAGE_LOCKS
est désactivé (OFF).
Jusqu’à SQL Server 2017 (14.x), la régénération d’un index columnstore en cluster est une opération hors connexion. Le moteur de base de données doit acquérir un verrou exclusif sur la table ou la partition lorsque la regénération se produit. Les données sont hors connexion et indisponibles pendant la régénération, même si vous utilisez NOLOCK
, l’isolation de capture instantanée de lecture validée (RCSI) ou l’isolation de capture instantanée. À partir de SQL Server 2019 (15.x), un index columnstore en cluster peut être régénéré à l’aide de l’option ONLINE = ON
.
Avertissement
La création et la reconstruction des index non alignés sur une table contenant plus de 1 000 partitions sont possibles, mais ne sont pas prises en charge. Cela peut entraîner une dégradation des performances ou une consommation de mémoire excessive. Microsoft recommande d’utiliser uniquement des index alignés lorsque le nombre de partitions est supérieur à 1 000.
FULLSCAN
dans CREATE STATISTICS
ou UPDATE STATISTICS
. En revanche, à partir de SQL Server 2012 (11.x), lorsqu’un index partitionné est créé ou reconstruit, les statistiques ne sont pas créées ou mises à jour par l’analyse de toutes les lignes de la table. C’est le taux d’échantillonnage par défaut qui est alors utilisé. Pour créer ou mettre à jour les statistiques sur les index partitionnés en analysant toutes les lignes de la table, utilisez CREATE STATISTICS ou UPDATE STATISTICS avec la clause FULLSCAN
.PERSIST_SAMPLE_PERCENT
définie sur ON
, les opérations d’index pouvant être reprises utilisent le taux d'échantillonnage persistant pour créer ou mettre à jour les statistiques.L’exemple suivant détermine la fragmentation moyenne et la densité de page pour tous les index rowstore de la base de données actuelle. Il utilise le mode SAMPLED
pour retourner des résultats utilisables rapidement. Pour obtenir des résultats plus précis, utilisez le mode DETAILED
. Cela nécessite d’analyser toutes les pages d’index, ce qui peut prendre beaucoup de temps.
SELECT OBJECT_SCHEMA_NAME(ips.object_id) AS schema_name,
OBJECT_NAME(ips.object_id) AS object_name,
i.name AS index_name,
i.type_desc AS index_type,
ips.avg_fragmentation_in_percent,
ips.avg_page_space_used_in_percent,
ips.page_count,
ips.alloc_unit_type_desc
FROM sys.dm_db_index_physical_stats(DB_ID(), default, default, default, 'SAMPLED') AS ips
INNER JOIN sys.indexes AS i
ON ips.object_id = i.object_id
AND
ips.index_id = i.index_id
ORDER BY page_count DESC;
L'instruction précédente retourne un jeu de résultats similaire au suivant :
schema_name object_name index_name index_type avg_fragmentation_in_percent avg_page_space_used_in_percent page_count alloc_unit_type_desc
------------ --------------------- ---------------------------------------- ------------- ---------------------------- ------------------------------ ----------- --------------------
dbo FactProductInventory PK_FactProductInventory CLUSTERED 0.390015600624025 99.7244625648629 3846 IN_ROW_DATA
dbo DimProduct PK_DimProduct_ProductKey CLUSTERED 0 89.6839757845318 497 LOB_DATA
dbo DimProduct PK_DimProduct_ProductKey CLUSTERED 0 80.7132814430442 251 IN_ROW_DATA
dbo FactFinance NULL HEAP 0 99.7982456140351 239 IN_ROW_DATA
dbo ProspectiveBuyer PK_ProspectiveBuyer_ProspectiveBuyerKey CLUSTERED 0 98.1086236718557 79 IN_ROW_DATA
dbo DimCustomer IX_DimCustomer_CustomerAlternateKey NONCLUSTERED 0 99.5197553743514 78 IN_ROW_DATA
Pour plus d’informations, consultez sys.dm_db_index_physical_stats.
L’exemple suivant détermine la fragmentation moyenne pour tous les index columnstore avec des groupes de lignes compressés dans la base de données actuelle.
SELECT OBJECT_SCHEMA_NAME(i.object_id) AS schema_name,
OBJECT_NAME(i.object_id) AS object_name,
i.name AS index_name,
i.type_desc AS index_type,
100.0 * (ISNULL(SUM(rgs.deleted_rows), 0)) / NULLIF(SUM(rgs.total_rows), 0) AS avg_fragmentation_in_percent
FROM sys.indexes AS i
INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS rgs
ON i.object_id = rgs.object_id
AND
i.index_id = rgs.index_id
WHERE rgs.state_desc = 'COMPRESSED'
GROUP BY i.object_id, i.index_id, i.name, i.type_desc
ORDER BY schema_name, object_name, index_name, index_type;
L'instruction précédente retourne un jeu de résultats similaire au suivant :
schema_name object_name index_name index_type avg_fragmentation_in_percent
------------ ---------------------- ------------------------------------ ------------------------- ----------------------------
Sales InvoiceLines NCCX_Sales_InvoiceLines NONCLUSTERED COLUMNSTORE 0.000000000000000
Sales OrderLines NCCX_Sales_OrderLines NONCLUSTERED COLUMNSTORE 0.000000000000000
Warehouse StockItemTransactions CCX_Warehouse_StockItemTransactions CLUSTERED COLUMNSTORE 4.225346161484279
Notes
Pour obtenir plus d’exemples sur l’utilisation de Transact-SQL pour reconstruire ou réorganiser des index, consultez Exemples ALTER INDEX : index rowstore et Exemples ALTER INDEX : index columnstore.
L’exemple suivant réorganise l’index IX_Employee_OrganizationalLevel_OrganizationalNode
sur la table HumanResources.Employee
de la base de données AdventureWorks2022
.
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode
ON HumanResources.Employee
REORGANIZE;
L’exemple suivant réorganise l’index columnstore IndFactResellerSalesXL_CCI
sur la table dbo.FactResellerSalesXL_CCI
de la base de données AdventureWorksDW2022
. Cette commande force tous les groupes de lignes ouverts et fermés dans le columnstore.
-- This command forces all closed and open row groups into columnstore.
ALTER INDEX IndFactResellerSalesXL_CCI
ON FactResellerSalesXL_CCI
REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
L’exemple suivant réorganise tous les index sur la table HumanResources.Employee
de la base de données AdventureWorks2022
.
ALTER INDEX ALL ON HumanResources.Employee
REORGANIZE;
L'exemple suivant reconstruit un seul index portant sur la table Employee
de la base de données AdventureWorks2022
.
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD
;
L’exemple suivant régénère tous les index associés à la table dans la base de données AdventureWorks2022
à l’aide du mot clé ALL
. Trois options sont spécifiées.
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON)
;
Pour plus d’informations, consultez ALTER INDEX.
Événements
31 mars, 23 h - 2 avr., 23 h
Le plus grand événement d’apprentissage SQL, Fabric et Power BI. 31 mars au 2 avril. Utilisez le code FABINSIDER pour économiser 400 $.
Inscrivez-vous aujourd’huiEntrainement
Module
Configurer des bases de données à des fins de performances optimales - Training
Configurer des bases de données à des fins de performances optimales
Documentation
ALTER INDEX (Transact-SQL) - SQL Server
Modifie une table ou un index d’affichage (rowstore, columnstore ou XML) existant en désactivant, en régénérant ou en réorganisant l’index d’une part, ou en définissant les options portant sur l’index d’autre part.
Option SORT_IN_TEMPDB pour les index - SQL Server
Option SORT_IN_TEMPDB pour les index
sys.dm_db_index_physical_stats (Transact-SQL) - SQL Server
Retourne des informations de taille et de fragmentation pour les données et les index de la table ou de la vue spécifiées dans le Moteur de base de données SQL Server.