2009-07-21 9 views
2

Nous avons une table Transactional Media contenant une clé primaire en cluster de 4 colonnes. RevenueCentreID, DateOfSale, MediaItemID et SaleTypeID. Il contient également une colonne de quantité et une colonne de montant.Index de couverture ou index individuels

La plupart de nos requêtes sélectionneront Centres de chiffre d'affaires pour une plage de dates pour un certain élément multimédia. Nous n'utilisons presque jamais le SaleTypeID. Serait-il préférable de créer un index sur RevenueCentreID, DateOfSale, MediaItemID ou un indice de couverture sur ces trois colonnes? Les numéros RevenueCentreID et RevenueCentreID sont respectivement des clés étrangères d'une table RevenueCentres Table et de MediaItems. Ils seront presque toujours joints à lors de l'exécution des requêtes.

Une requête typique ressemble à quelque chose comme celui ci-dessous:

Select 
    RevenueCentreID, 
    MediaItemID, 
    DateOfSale, 
    SUM(Quantity)Quantity, 
    SUM(Amount)Amount 
From 
    Media m 
    Inner Join RevenueCentres rc on m.RevenueCentreID = rc.RevenueCentreID 
    Inner Join MediaItems mi on m.MediaItemID = mi.MediaItemID 
    Inner Join MediaCategories mc on mi.MediaCategoryID = mc.MediaCategoryID 
Where 
    rc.ProfitCentreID = 1 
    And mc.MediaCategoryID = 1 
    And (DateOfSale Between '20090713' and '20090719') 
Group By 
    DateOfSale, 
    RevenueCentreID, 
    MediaItemID 

Toutes les suggestions seraient appréciés ...

Répondre

3

En supposant SQL Server (vous ne spécifiez pas exactement ce système que vous utilisez):

Si vous spécifiez ces trois élément (RevenueCentreID, DateOfSale, MediaItemID) pour presque toutes les requêtes de toute façon, un seul index ces trois (si vous spécifiez toujours les trois, ou les deux mêmes de trois) seraient mieux que d'avoir trois indices simples.

L'ordre doit être de telle sorte que la sélection des champs est trois, ou les deux à gauche, ou un seul à gauche:

(RevenueCentreID, DateOfSale, MediaItemID) 
(RevenueCentreID, DateOfSale) 
(RevenueCentreID) 

Si vous créez l'index dans cet ordre (RevenueCentreID, DateOfSale, MediaItemID), il ne sera pas utilisé si vous interrogez fréquemment sur (RevenueCentreID, MediaItemID) (vous ne pouvez pas avoir une colonne dans le milieu manquant lorsque vous spécifiez une clause WHERE).

Il est préférable de conserver un seul index qui sera utilisé la plupart du temps plutôt que d'avoir trois index distincts - c'est juste plus de frais généraux.

Marc

+0

Toutes mes excuses, oui il est serveur SQL 2005. Serait-il possible de savoir à quel serveur SQL ferait si, pour des arguments, j'ai eu un index séparé de la RevenueCentreID et sur DateOfSale. Je cours une requête qui utilise seulement le RevenueCentreID et le DateOfSale. Pourrait-il choisir un index dit RevenueCentreID, trouver les RevenueCentres, puis passer à la clé primaire pour obtenir les dates et vice versa. Sinon, il utiliserait le premier index pour obtenir RevenueCentres, puis utiliser le second pour obtenir les dates, puis passer à la clé primaire. Ou je suppose qu'il pourrait même simplement utiliser la clé primaire. – MarcoF

+0

Vous pouvez voir ce que fait exactement SQL Server dans SQL Server Mgmt Studio lorsque vous activez l'option "Requête/Inclure le plan d'exécution réel" et exécutez la requête en question. Il vous montrera exactement quels indices sont utilisés (ou ignorés) –

0

Une bonne règle de base est d'indexer chaque colonne des jointures, et toutes les colonnes vous effectuez une requête sur.