Aller au contenu

Microsoft SQL Server/Performances

Un livre de Wikilivres.

Optimisation de requêtes

[modifier | modifier le wikicode]

Les hints ou indicateurs permettent d'optimiser les transactions pour arriver au même résultat plus rapidement avec moins de ressources.

Pour comparer ceux-ci, il suffit de lancer dans le menu Requête, Afficher le plan d'exécution estimé.

Lors d'une exécution via SQL Studio, le bouton "include le plan d'exécution réel" permet de voir si l'ordre des opérations est le plus judicieux (généralement on procède par projection, puis sélection et jointure). Ce plan peut être enregistré en XML, au format .sqlplan.

Les hints sont stipulés à la fin de la requête, avec les clauses WITH ou OPTION entre parenthèses[1].

Plan d'exécution

[modifier | modifier le wikicode]

Le plan d'exécution d'une requête peut s'affiche sous son résultat en l'activant ainsi :

SET STATISTICS PROFILE ON

Il existe plusieurs types d'indexation des tables sur MSSQL[2] :

  • index unique : index appliqué sur une clé candidate. On le crée avec la clause CREATE UNIQUE INDEX ;
  • index non-cluster : index par défaut si aucun n'est précisé (CREATE INDEX = CREATE NONCLUSTERED INDEX) ;
  • index cluster : particularité de Microsoft SQL Server[3] qui stocke les données dans les feuilles de l'arbre. L'ordre physique correspond donc à l'ordre logique des enregistrements ;
  • index XML primaire : pour les balises XML ;
  • index spatial : pour les bases de données spatiales ;
  • index columnstore.

Pour savoir quel sont les index d'une table :

sp_helpindex  table1

Par convention on nommera les index avec un préfixe "IX_" :

CREATE INDEX IX_Date   
ON MaBase.table1(Champ_Date);

Pour le type de données XML, il existe aussi CREATE XML SCHEMA COLLECTION[4].

Pour permettre à l'optimiseur de requêtes un élagage rapide des enregistrements à ne pas parcourir lors d'une sélection, il faut utiliser le ou les index les plus appropriés par rapport aux conditions (WHERE) :

SELECT *
FROM table1 WITH (INDEX(IX_Date))
WHERE Champ_Date between '20150101' and '20150131'
DROP INDEX MaBase.table1.IX_Date

GROUP BY avec ROLLUP, CUBE et GROUPING SETS[5].

Pour répliquer une base de données sur un autre serveur, il faut configurer une mise en miroir sur au moins trois serveurs : le principal, le miroir, et le témoin pour les contrôler. Il est déconseillé d'héberger l'instance du témoin sur les mêmes machines que les deux premiers[6]. Toutefois si cela arrive, il faudra lui spécifier un port différent de celui par défaut (5022).

Partitionnement

[modifier | modifier le wikicode]

CREATE PARTITION SCHEME[7].

Haute disponibilité

[modifier | modifier le wikicode]

Prévoir un audit trimestriel pour déterminer les requêtes les plus consommatrices[8].

  1. http://msdn.microsoft.com/fr-fr/library/ms187713%28v=sql.100%29.aspx
  2. https://msdn.microsoft.com/fr-fr/library/ms188783.aspx
  3. https://msdn.microsoft.com/fr-fr/library/ms190457.aspx
  4. https://msdn.microsoft.com/en-us/library/ms176009.aspx
  5. https://technet.microsoft.com/fr-fr/library/bb522495%28v=sql.105%29.aspx
  6. https://technet.microsoft.com/fr-fr/library/ms175191(v=sql.105).aspx
  7. https://msdn.microsoft.com/en-us/library/bb934097.aspx
  8. http://www.dbta.com/Editorial/Trends-and-Applications/Essential-Tips-on-SQL-Server-Database-Performance-108768.aspx