J'ai une table avec environ 20 millions d'enregistrements.
Structure est comme: p> 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
9 Réponses :
Je ferais sûr que Caredat est indexé correctement p>
Il serait agréable de comparer la requête avec et sans l'ordre par CreatedAt Code> 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.
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. P>
Donc, le 2 qui donnera probablement la meilleure performance répétable (essayez-les et comparez) serait: p>
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. p>
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.
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 également, vérifiez que les index uniquesIdentifier sont non groupé. p> p>
Je recommanderais d'obtenir les données dans 2 tables Var puis appliquer un syndicat à partir des sélectes, commandés et supérieur. Limitez les données de l'issue Go. P> P>
Je suggère d'utiliser un syndicat:
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)
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 P>
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: P>
Voici quelques ressources sur la manière d'enquêter et de résoudre ces problèmes: P>
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. P>
Votage de celui-ci, comme j'ai presque exactement le même problème!