sql >> Databáze >  >> RDS >> Sqlserver

Příkaz SQL - Jak lze zlepšit rychlost indexováním

Tento index bude pravděpodobně užitečný, ale mějte na paměti, že neexistuje žádný bezplatný oběd (indexy je třeba udržovat, takže to ovlivní vaši zátěž vkládání/aktualizace/mazání):

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;

Nyní může váš dotaz znít:

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!

Pokud změníte hodnoty některých z těchto příznaků v závislosti na dotazu, můžete experimentovat s přidáním těchto sloupců do klíče indexu namísto filtru, např. řekněme, že někdy zkontrolujete OnHold = 0 a někdy 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;

Můžete také experimentovat s MemberMailID v klíči místo INCLUDE . např.:

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;

Tyto rozdíly nemusí být důležité pro vaše data a vzorce používání, ale budete moci otestovat rozdíly snáze, než budeme schopni uhodnout.



  1. Spouštěče prevence

  2. postgresql 9.1 - přístup k tabulkám pomocí funkcí

  3. Posílejte a získejte zároveň v php

  4. Jak specifikovat řazení s PDO bez SET NAMES?