Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Instrução SQL - Como melhorar a velocidade com a indexação


Este índice provavelmente será útil, mas lembre-se de que não há almoço grátis (os índices precisam ser mantidos, portanto, isso afetará sua carga de trabalho de inserção/atualização/exclusão):
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;

Agora sua consulta pode dizer:
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!

Se você alterar os valores de alguns desses sinalizadores dependendo da consulta, poderá experimentar adicionar essas colunas à chave do índice em vez do filtro, por exemplo, digamos que às vezes você verifique OnHold = 0 e às vezes 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;

Você também pode experimentar ter MemberMailID na chave em vez de INCLUDE . por exemplo.:
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;

Essas diferenças podem não ser importantes para seus dados e padrões de uso, mas você poderá testar as diferenças com mais facilidade do que podemos adivinhar.