sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Statement - Hvordan kan man forbedre hastigheden med indeksering

Dette indeks vil sandsynligvis være nyttigt, men husk, at der ikke er nogen gratis frokost (indekser skal vedligeholdes, så dette vil påvirke din indsæt/opdater/slet arbejdsbyrde):

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;

Nu kan din forespørgsel sige:

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!

Hvis du ændrer værdierne for nogle af disse flag afhængigt af forespørgslen, kan du eksperimentere med at tilføje disse kolonner til nøglen til indekset i stedet for filteret, f.eks. Lad os sige, at du nogle gange tjekker efter OnHold = 0 og nogle gange 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;

Du vil måske også eksperimentere med at have MemberMailID i nøglen i stedet for INCLUDE . f.eks.:

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;

Disse forskelle har muligvis ikke betydning for dine data og brugsmønstre, men du vil være i stand til at teste forskelle nemmere, end vi kan gætte.



  1. Indsat IP i MySQL-databasen ændres hver gang

  2. MySQL Auto Increment Columns på TRANSACTION, COMMIT og ROLLBACK

  3. MySQL TIMESTAMP til QDateTime med millisekunder

  4. Hvordan indsætter jeg en BC-dato i Oracle?