Database
 sql >> Base de données >  >> RDS >> Database

Gestion automatique des index dans Azure SQL Database

En février, j'ai écrit un article de blog sur la correction automatique des plans dans SQL Server, et dans cet article, je souhaite parler de la gestion automatique des index, le deuxième composant de la fonctionnalité de réglage automatique. La gestion automatique des index n'est disponible que dans Azure SQL Database et n'est pas actuellement sur la feuille de route pour être disponible dans la prochaine version de SQL Server sur site. Cette option est activée indépendamment de la correction automatique du plan et, comme son nom l'indique, elle gérera les index de votre base de données. Plus précisément, il peut créer des index manquants et supprimer les index non utilisés et ceux qui sont en double. Voyons comment cela se produit.

Sous les couvertures
Automatic Index Management s'appuie sur les données pour prendre sa décision. Pour la création potentielle d'un index, il utilise les informations de l'index manquant DMV et les suit dans le temps et combine ces données avec un modèle interne pour déterminer l'avantage de l'index. Il utilise également le magasin de requêtes pour déterminer si l'index offre des avantages, il doit donc être activé pour la base de données, tout comme avec la correction automatique du plan. En ce qui concerne la suppression des index, les données de la DMV d'utilisation de l'index (sys.dm_db_index_usage_stats) ainsi que les métadonnées de l'index (par exemple, le nombre de colonnes, les types de données de colonne) sont utilisées.

Activation de la gestion automatique des index
Comme mentionné, Query Store doit être activé pour la base de données. Cela peut être fait dans SSMS, avec T-SQL et avec l'API REST pour Azure SQL Database. Notez que Query Store est activé par défaut pour les bases de données dans Azure, et ce depuis le 4e trimestre 2016.

USE [master];
GO
ALTER DATABASE [WideWorldImporters] 
	SET QUERY_STORE = ON;
GO
ALTER DATABASE [WideWorldImporters] 
	SET QUERY_STORE (OPERATION_MODE = READ_WRITE);
GO

Une fois le magasin de requêtes activé, vous pouvez utiliser le portail Azure, T-SQL ou l'API EST pour activer la gestion automatique des index dans Azure SQL Database (C# et PowerShell sont en préparation).

ALTER DATABASE [WWI_PS] SET AUTOMATIC_TUNING (CREATE_INDEX = ON, DROP_INDEX = ON);
GO

La gestion automatique des index sera activée par défaut pour les nouvelles bases de données dans Azure (https://azure.microsoft.com/en-us/blog/automatic-tuning-will-be-a-new-default/) dans un futur proche. À partir de janvier 2018, Microsoft a commencé le déploiement pour activer le réglage automatique pour les bases de données SQL Azure qui ne l'avaient pas déjà activé, avec des notifications envoyées aux administrateurs afin que l'option puisse être désactivée si vous le souhaitez. Ce processus prend plusieurs mois, donc si vous n'avez pas encore reçu de notification, pas de panique !

Comment ça marche
Pour la création d'index, il existe actuellement une fenêtre mobile de sept (7) jours* pendant laquelle les données sont suivies, et au minimum le modèle a besoin de neuf (9) heures* de données pour recommander un index, ainsi que avec 12 heures* de données dans Query Store qui serviront de référence. S'il est déterminé qu'un index fournira des avantages significatifs, SQL Server créera l'index.

*Ces valeurs peuvent changer à l'avenir, à mesure que le modèle se développe.

Remarque :à l'heure actuelle, le modèle fusionne les recommandations. Autrement dit, si plusieurs index sont recommandés pour une table, mais qu'un index peut être créé pour couvrir toutes les options, il peut créer cet index actuellement. Cependant, le modèle n'est actuellement pas assez intelligent pour fusionner un index recommandé avec un qui existe déjà.

Une fois qu'un index est créé, SQL Server vérifie qu'il offre des avantages à l'aide du magasin de requêtes (il doit donc être activé pour la base de données). Il surveille les performances de toute requête qui utilise le nouvel index et compare le processeur de la requête avant l'ajout de l'index et lors de l'utilisation de l'index. S'il y a une régression des performances de la requête à la suite de l'index, il rétablira (supprimera) l'index. SQL Server surveille les performances des requêtes jusqu'à trois (3) jours, ou jusqu'à ce que 100 % de la charge de travail pertinente ait été analysée. Après cette période, si l'indice ne montre aucun signe de régression, il n'examinera plus ses performances.

Comprenez que si Automatic Index Management crée un index, puis deux mois plus tard, votre charge de travail change et qu'elle bénéficierait de ce même index créé automatiquement précédemment mais avec une colonne supplémentaire, alors SQL Server créera, à l'heure actuelle, un nouvel index. Actuellement, il n'y a aucune logique pour modifier un index existant créé automatiquement, mais cette fonctionnalité est sur la feuille de route pour la fonctionnalité.

En ce qui concerne la suppression d'index, si un index n'a pas de recherches ou d'analyses pendant 90 jours, mais a un coût de maintenance (ce qui signifie qu'il y a des insertions, des mises à jour ou des suppressions), il sera supprimé. Les index en double seront également supprimés, en supposant qu'ils sont un doublon exact (et le schéma est utilisé pour déterminer si les index sont exactement les mêmes). S'il existe des index en double en termes de colonnes clés et de colonnes incluses (le cas échéant) mais qu'un ou plusieurs d'entre eux ont un filtre, ils ne sont pas vraiment en double et aucun index ne sera supprimé.

Pour référence, il existe deux fois plus de recommandations DROP INDEX dans Azure SQL Database que de recommandations CREATE INDEX.

Lorsque vous activez l'option DROP INDEX, SQL Server supprime les index créés par l'utilisateur. Lorsque vous activez l'option CREATE INDEX, SQL Server a la capacité de créer des index automatiquement et peut également supprimer ces index (mais ne supprimera pas les index créés par l'utilisateur). Enfin, les index sont créés et supprimés pendant les périodes de charge de travail non maximale, comme déterminé par DTU. Si la charge de travail est supérieure à 80 % DTU, SQL Server attendra pour créer ou supprimer l'index jusqu'à ce que la charge système diminue.

Est-ce que je vais vraiment laisser SQL Server prendre le contrôle ?
Peut-être. Ma recommandation sur cette fonctionnalité nécessite initialement une approche "faire confiance mais vérifier".

Comme pour la correction automatique des plans, la gestion automatique des index a été développée avec une quantité importante de données capturées à partir de près de deux millions de bases de données Azure SQL. La fonctionnalité de gestion automatique des index est disponible dans Azure SQL Database depuis le premier trimestre de 2016, dans le cadre d'Index Advisor.

Les algorithmes utilisés par la fonctionnalité ont évolué et continuent d'évoluer au fil du temps, à mesure que de plus en plus de bases de données l'utilisent et que davantage de données sont capturées et analysées. Cependant, il existe actuellement certaines limitations.

  1. Les recommandations d'index ne sont pas évaluées par rapport aux index existants. Par conséquent, la consolidation d'index entre les nouveaux index et les index existants n'est pas disponible actuellement.
  2. Si un index offre des avantages pour un SELECT, la surcharge des modifications dues aux INSERT, UPDATE et DELETE n'est pas connue avant la création. SQL Server surveille cette surcharge pendant le processus de vérification, une fois l'index implémenté.

La gestion automatique des index présente des avantages qui valent la peine d'être mentionnés :

  1. Pour toute personne qui doit gérer une base de données SQL Server, mais qui n'est pas un administrateur de base de données, les recommandations d'index peuvent être extrêmement utiles.
  2. Les recommandations d'index sont capturées dans la DMV sys.dm_db_tuning_recommendations même si les options d'index CREATE et DROP ne sont pas activées. Par conséquent, si vous n'êtes pas sûr des modifications que SQL Server pourrait apporter, vous pouvez examiner ce qui est capturé dans le DMV, puis prendre la décision d'implémenter manuellement la recommandation.

    Remarque :Si vous implémentez manuellement la recommandation, SQL Server n'effectue aucune validation. Si vous implémentez la recommandation via le portail (en utilisant le bouton Appliquer) ou l'API REST, elle sera exécutée comme s'il s'agissait d'une action automatique et la validation sera effectuée (et l'index pourrait être automatiquement annulé en cas de régression).

  3. La fonctionnalité continue de s'améliorer. Comme je l'ai déjà dit, Microsoft n'essaie pas de coder les administrateurs de base de données ou les développeurs au chômage, il essaie de s'attaquer aux fruits à portée de main afin que vous ayez plus de temps pour les tâches et les projets qui ne peuvent pas être automatisés intelligemment.

Résumé
Si vous n'êtes pas prêt à passer le relais de la gestion indicielle, je comprends. Mais si vous avez au minimum une base de données Azure SQL, vous devez vérifier régulièrement le DMV sys.dm_db_tuning_recommendations pour voir ce que SQL Server recommande, et comparer cela aux données que vous ou votre outil de surveillance tiers pourriez capturer sur l'utilisation de l'index. Après tout, à quand remonte la dernière fois que vous avez effectué un examen complet et approfondi de vos index pour comprendre ce qui manque, ce qui est réellement utilisé et ce qui génère simplement une surcharge dans la base de données ?