Maison >base de données >tutoriel mysql >Pourquoi SQL COUNT(*) est-il lent et comment puis-je l'accélérer ?

Pourquoi SQL COUNT(*) est-il lent et comment puis-je l'accélérer ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 20:19:12533parcourir

Why is SQL COUNT(*) Slow, and How Can I Speed It Up?

Performance SQL Count(*) : pourquoi c'est lent et comment l'améliorer

Lorsque vous traitez de grandes tables, il est important de comprendre comment certaines requêtes, telles que « COUNT() », affectent les performances. Cet article explique pourquoi une simple requête « COUNT() » peut entraîner des différences de performances significatives en fonction de ses paramètres.

Dans l'exemple donné, la requête « if (select count() from BookChapters) = 0' s'exécute rapidement car SQL Server l'optimise en « s'il existe (sélectionnez dans BookChapters) ». Cette version optimisée analyse une seule ligne au lieu de compter toutes les lignes.

Cependant, les requêtes 'if (select count() from BookChapters) = 1' et 'if (select count( ) de BookChapters) > 1' fonctionne plus lentement car SQL Server utilise une logique différente. Lorsqu'une table ne dispose pas d'index non clusterisés, SQL Server utilise l'index non clusterisé le plus étroit pour les opérations « COUNT(*) ». Sans index non clusterisé, il doit analyser la table entière, ce qui peut prendre beaucoup de temps pour les grands ensembles de données.

Optimisation de la vitesse du nombre (*)

Pour améliorer les performances de 'COUNT(*)' requêtes, envisagez ces stratégies :

  • Ajouter un index : SQL Server peut utiliser un index non clusterisé pour affiner la recherche et réduire l'analyse des tables.
  • Utilisez la table système sysindexes : Cette table fournit le nombre de lignes sans encourir le surcharge d’une analyse complète de la table. Dans SQL Server 2005 ou version ultérieure, utilisez la requête suivante :
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
  • Pour SQL Server 2000 :
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc

En utilisant ces techniques, vous pouvez accélérer considérablement le temps d'exécution des requêtes 'COUNT(*)', en particulier sur les requêtes de grande taille. ensembles de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn