Existe-t-il une règle de sélectivité générale du moment où appliquer l'index non clustered?
Nous savons ne pas créer d'index sur une colonne de bits, 50/50. "Row avec une distribution 50/50, cela pourrait vous acheter très peu de gain de performance" champ de bit d'index dans SQL Server
Alors, quelle est la sélectivité d'une requête SQL dans SQL Server avant qu'un index ne soit appliqué? Existe-t-il une règle générale dans les directives SQL Server? À 25% de la distribution de sélectivité moyenne dans une colonne? 10% de sélectivité?
Cet article indique environ 31%? Comment sélective doit être indexé?
Considérant la sélectivité des colonnes uniquement lorsque vous décidez quelles colonnes à index ignorent un peu de ce que les index peuvent faire et ce qu'ils sont généralement bons pour.
Par exemple, vous pouvez avoir une colonne d'identité ou de guidiste incroyablement sélective - unique, même - mais jamais utilisé. Dans ce cas, qui se soucie? Pourquoi les colonnes d'index que les requêtes ne touchent pas?
Des index beaucoup moins sélectifs, même BIT
colonnes, peuvent faire des parties utiles ou utiles d'index. Dans certains scénarios, des colonnes très sélectives sur de grandes tables peuvent bénéficier d'un peu d'indexation lorsque elles doivent être triées, ou groupées par.
joint
Prenez cette requête:
SELECT COUNT(*) AS records
FROM dbo.Users AS u
JOIN dbo.Posts AS p
ON u.Id = p.OwnerUserId;
Sans un indice utile sur OwnerUserId
, c'est notre plan avec une jointure de hachage - quels déversements - mais c'est secondaire au point.
Avec un indice utile - CREATE INDEX ix_yourmom ON dbo.Posts (OwnerUserId);
- Notre plan change.
agrégats
De même, les opérations de regroupement peuvent bénéficier de l'indexation.
SELECT p.OwnerUserId, COUNT(*) AS records
FROM dbo.Posts AS p
GROUP BY p.OwnerUserId;
Sans index:
Avec un index:
Tremples
Les données de tri peuvent être un autre point de collage dans les requêtes que les index peuvent aider.
Sans index:
Avec notre index:
Blocage
Les index peuvent également aider à éviter de bloquer les empilements.
Si nous essayons d'exécuter cette mise à jour:
UPDATE p
SET p.Score += 100
FROM dbo.Posts AS p
WHERE p.OwnerUserId = 22656;
Et exécuter simultanément cette sélection:
SELECT *
FROM dbo.Posts AS p
WHERE p.OwnerUserId = 8;
Ils finiront par blocer:
Avec notre index en place, le Select termine instantanément sans être bloqué. SQL Server a un moyen d'accéder aux données dont il a besoin de manière efficace.
Si vous vous demandez (en utilisant l'équation Kumar fourni), la sélectivité de la colonne OwnerUserid est 0.0701539878296839478
Enveloppez-le
N'enfonçoit pas simplement les colonnes d'indexations aveuglées en fonction de leur sélectivité. Index des concepteurs qui aident votre charge de travail fonctionnant efficacement. En utilisant des colonnes plus sélectives car les principales colonnes de touches sont généralement une bonne idée lorsque vous recherchez des prédicats d'égalité, mais peuvent être moins utiles lorsque vous recherchez des gammes.