9
votes

SQL Server Sloge Select à partir de la grande table

J'ai une table avec environ 20 millions d'enregistrements.

Structure est comme: p> xxx pre>

la table reçoit environ 100 000 enregistrements chaque jour. P> J'ai des index sur chaque colonne, à l'exception de MeidS, car il n'est pas utilisé dans "où" clauses p>

Le problème est quand je veux ramasser, par exemple. Derniers 100 enregistrements pour SourceRuserID désiré p>

La requête prend parfois jusqu'à 4 minutes pour exécuter, ce qui n'est pas acceptable. p>

SELECT TOP 100 * FROM Events WITH (NOLOCK)
WHERE SourceUserId = '15b534b17-5a5a-415a-9fc0-7565199c3461'
AND 
(
 TypeId IN (2, 3, 4)
    OR 
 (TypeId = 60 AND SrcMemberId != DstMemberId)
)
ORDER BY CreatedAt DESC


1 commentaires

Votage de celui-ci, comme j'ai presque exactement le même problème!


9 Réponses :


0
votes

Je ferais sûr que Caredat est indexé correctement


2 commentaires

Il serait agréable de comparer la requête avec et sans l'ordre par CreatedAt Clause!


Un index uniquement sur CreateAt n'aurait probablement pas l'aide de ce type de requête ainsi qu'un composite sur le filtre d'égalité SourceRuserid - un index uniquement sur CareDaT permettrait simplement à l'optimiseur de numériser à l'arrière d'un arbre B. Sourceuserid jusqu'à ce qu'il ait trouvé 100 avec la valeur spécifiée (si la sourceReReid est très sélective, cela entraînerait probablement une analyse assez longue). Si vous Index composites sur SourceReReidid, l'optimiseur peut sauver la numérisation, chercher à SourceReReid donné et tirer simplement la finale pré-commandée.



15
votes

Vous voudrez probablement créer un index composite pour ce type de requête - lorsque la requête fonctionne lentement, elle choisit probablement de numériser un index sur la colonne créée et exécuter un filtre résiduel sur la valeur SourceReReid, quand réalité Ce que vous voulez faire est de passer directement à tous les enregistrements d'un source d'utilisateur donné commandé correctement - pour y parvenir, vous souhaiterez créer un index composite principalement sur SourceRuserid (effectuer une vérification de l'égalité) et sur la base de CreativeAeat (pour préserver le ordre au sein d'une valeur sourceReReReRIDE donnée). Vous voudrez peut-être essayer d'ajouter également le typeId en fonction de la sélectivité de cette colonne.

Donc, le 2 qui donnera probablement la meilleure performance répétable (essayez-les et comparez) serait:

  1. Index sur (SourceReReid, Caredate)
  2. Index sur (SourceReReid, Typeid, Caredate)

    Comme toujours, il existe également de nombreuses autres considérations pour prendre en compte la détermination de la détermination de la manière / laquelle / où indexer, car Remus discute dans une réponse distincte, une grande considération couvre la recherche par rapport à la recherche. De plus, vous aurez besoin de considérer des volumes d'écriture, Impact possible de la fragmentation (si Tout) , Singleton Recherches vs. Grandes analyses séquentielles, etc., etc.


2 commentaires

Yeap, comme avec de nombreuses questions SQL SQL, la réponse n'est pas une affaire magique Sélection de la magie mais une bonne conception de l'indice de mode.


Regrouper cet index et avoir un disque à rayures aiderait également.



0
votes

Vous pouvez diviser la requête en deux avec une union pour éviter le ou (qui peut causer votre index de ne pas utiliser), quelque chose comme xxx

également, vérifiez que les index uniquesIdentifier sont non groupé.


0 commentaires

1
votes

Je recommanderais d'obtenir les données dans 2 tables Var xxx

puis appliquer un syndicat à partir des sélectes, commandés et supérieur. Limitez les données de l'issue Go.


0 commentaires

1
votes

Je suggère d'utiliser un syndicat: xxx


0 commentaires

6
votes

J'ai des index sur chaque colonne sauf Métaid p>

Les index non couvrant atteindront probablement le "Point de basculement" et la requête reviendrait à une balayage de table. Il suffit d'ajouter un index sur chaque colonne car elle est utilisée dans une clause où l'établissement n'équitent pas la conception de la bonne index. Pour prendre votre requête, par exemple, un bon index de revêtement de 100% serait le suivant: P>

INDEX ON (SourceUserId , CreatedAt)

0 commentaires

0
votes

S'il y a 100k enregistrements ajoutés chaque jour, vous devez vérifier votre fragmentation de l'index. Et reconstruire ou réorganiser en conséquence. Plus d'informations : SQLAUTHORITY


0 commentaires

5
votes

Le fait que la table ait des index construits sur des valeurs de GUID, indique une éventuelle série de problèmes qui affecteraient les performances:


0 commentaires

1
votes

Nous avons réalisé un gain mineur en passant à une clé d'identité de Bigint pour notre tableau d'événements; En utilisant cela comme clé primaire en cluster, nous pouvons tricher et utiliser cela pour la commande de jour.


0 commentaires