Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Anweisung - Wie kann die Geschwindigkeit beim Indizieren verbessert werden?

Dieser Index wird wahrscheinlich hilfreich sein, aber denken Sie daran, dass es kein kostenloses Mittagessen gibt (Indexe müssen gepflegt werden, daher wirkt sich dies auf Ihre Arbeitsbelastung beim Einfügen/Aktualisieren/Löschen aus):

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

Jetzt kann Ihre Abfrage sagen:

SELECT TOP (1) MemberMailID
  FROM dbo.MemberMail -- dbo prefix
    WITH (INDEX (unread_emails)) -- in case you need to force, though you should not
WHERE ToMemberID = 102
AND ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0
ORDER BY ToMemberID; -- ORDER BY is important!

Wenn Sie die Werte einiger dieser Flags abhängig von der Abfrage ändern, können Sie damit experimentieren, diese Spalten anstelle des Filters zum Schlüssel des Index hinzuzufügen, z. Nehmen wir an, Sie suchen manchmal nach OnHold = 0 und manchmal OnHold = 1 :

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, OnHold)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND ToArchivedFlag = 0;

Sie können auch mit MemberMailID experimentieren im Schlüssel anstelle des INCLUDE . zB:

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

Diese Unterschiede mögen für Ihre Daten- und Nutzungsmuster keine Rolle spielen, aber Sie können die Unterschiede leichter testen, als wir erraten können.