8
votes

Choisir des index optimaux pour une table SQL Server

J'ai une table SQL Server avec la structure suivante:

CREATE TABLE [dbo].[Log](
 [LogID] [bigint] IDENTITY(1,1) NOT NULL,
 [A] [int] NOT NULL,
 [B] [int] NOT NULL,
 [C] [int] NOT NULL,
 [D] [int] NOT NULL,
 [E] [int] NOT NULL,
 [Flag1] [bit] NOT NULL,
 [Flag2] [bit] NOT NULL,
 [Flag3] [bit] NOT NULL,
 [Counter] [int] NOT NULL,
 [Start] [datetime] NOT NULL,
 [End] [datetime] NOT NULL)


0 commentaires

5 Réponses :


3
votes

Une approche est de laisser SQL Server vous dire l'utilisation optimale. Exécutez une trace pendant quelques min pendant que la table est sous une utilisation "typique", puis exécutez le conseiller de syntonisation du moteur de base de données


3 commentaires

... et il renvoie 0 recommandations! :)))))


Brillant, c'est la voie à suivre :)


Combien d'enregistrements étaient dans la table lorsque vous avez fait ce test est la question? Parfois, une analyse de l'index ou une analyse de table est mauvaise, mais pour une petite table, ce n'est pas grave. Je suppose que le conseiller de syntonisation du moteur ne pensait pas que des index puissent améliorer les performances.



4
votes

Les tables de journal sont rarement indexées, car l'indexation ralentit insertion, mise à jour et supprimer des instructions.

Je recommanderais soit:

  • Chargement des enregistrements dans une table (temporaire ou réel, indexé) avant de filtrer
  • en utilisant une vue indexée

    Fondamentalement - si la vitesse / la performance est une grosse préoccupation, indexez les enregistrements sous une autre forme de tableau afin que la journalisation n'est pas affectée.


0 commentaires

13
votes

Je doute que quiconque puisse faire quelque chose, mais une supposition - vous devez enregistrer l'utilisation de la table et voir à partir de cette utilisation quelles combinaisons de colonnes sont interrogées.

  1. Créez un indice "maître" qui tiendrait toutes ces colonnes

    C'est définitivement pas une bonne idée - si vous avez un index sur (A, B, C, D, E) et vous limitez votre requête par des valeurs de B et D, cet index est totalement inutile. C'est seulement utile

    • Si vous interrogez par Toutes les cinq colonnes fréquemment
    • Par combinaisons comme (A, B), (A, B, C), (A, B, C, D) fréquemment

      Dans n'importe quel autre cas, c'est un gaspillage - n'utilisez pas cela.

      1. Identifiez certaines des combinaisons de filtres les plus utilisées par ex. [A, D, E], [A, Démarrer, fin] etc. et créer des index Pour eux

        Oui, c'est vraiment la seule façon qui promet de succès. Vous devez voir quel type de requêtes se produisent réellement, puis modifier pour ceux-ci.


0 commentaires

3
votes

Dans n'importe quel index Combinaiton, les touches internes ne peuvent être utilisées que si la clé extérieure est également référencée. Dites que vous avez un index sur (a, b, c, d) :


0 commentaires

0
votes

Je placerais un index sur Démarrage (DateTime) et c'est tout, en supposant que peu de questions contre le journal seront créées à jour et la plupart dureront d'un point de départ.


0 commentaires