271 votes

Le moyen le plus rapide de compter le nombre exact de lignes dans une très grande table?

Je suis venu à travers les articles que l'état SELECT COUNT(*) FROM TABLE_NAME sera lente lorsque le tableau a beaucoup de lignes et de beaucoup de colonnes.

J'ai une table qui peut contenir des milliards de lignes [il a environ 15 colonnes]. Est-il un meilleur moyen d'obtenir le EXACTE de compter le nombre de lignes d'une table?

Veuillez considérer ce qui suit avant de votre réponse:

  • Je suis à la recherche d'un fournisseur de base de données solution indépendante. C'est OK si c' couvre MySQL, Oracle, MS SQL Server. Mais si il n'y a vraiment pas de base de données fournisseur indépendant de la solution puis-je allons régler les différentes solutions pour les différents fournisseurs de bases de données.

  • Je ne peux pas utiliser n'importe quel autre outil externe pour ce faire. Je suis principalement à la recherche d'un SQL base de la solution.

  • Je ne peut pas normaliser ma conception de base de données toute autre. Il est déjà en 3FN et, de plus, une beaucoup de code a déjà été écrit autour de lui.

282voto

gbn Points 197263

Réponse Simple:

  • fournisseur de base de données indépendant de la solution = utilisation standard = COUNT(*)
  • il y a approximative de SQL Server des solutions, mais ne pas utiliser COUNT(*) = en dehors de la portée

Notes:

COUNT(1) = COUNT(*) = COUNT(PrimaryKey) juste au cas où

Edit:

SQL Server exemple (1,4 milliard de lignes, 12 colonnes)

SELECT COUNT(*) FROM MyBigtable WITH (NOLOCK)
-- NOLOCK here is for me only to let me test for this answer: no more, no less

1 pistes, 5:46 minutes, compteur = 1,401,659,700

--Note, sp_spaceused uses this DMV
SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
    object_name(object_id) = 'MyBigtable' AND (index_id < 2)

2 points, deux de moins de 1 seconde, compteur = 1,401,659,670

La seconde a moins de lignes = mauvais. Serait le même ou plus selon les écritures (suppressions sont effectuées en dehors des heures ici)

33voto

salbahra Points 121

Le moyen le plus rapide de loin sur MySQL est:

 SHOW TABLE STATUS;
 

Vous obtiendrez instantanément toutes vos tables avec le nombre de lignes (qui est le total) ainsi que de nombreuses informations supplémentaires si vous le souhaitez.

12voto

jams Points 7774

Vous pouvez essayer ceci sp_spaceused (Transact-SQL)

Affiche le nombre de lignes, l'espace disque réservé et l'espace disque utilisé par une table, une vue indexée ou une file d'attente Service Broker dans la base de données actuelle, ou affiche l'espace disque réservé et utilisé par l'ensemble de la base de données.

10voto

Denis Points 34131

Je suis venu à travers les articles que l'état SELECT COUNT(*) from TABLE_NAME sera lente lorsque le tableau a beaucoup de lignes et de beaucoup de colonnes.

Cela dépend de la base de données. Certains d'accélérer compte, par exemple en gardant la trace de savoir si les lignes sont vivants ou morts dans l'index, ce qui permet pour un indice de la seule analyse pour extraire le nombre de lignes. D'autres ne le font pas, et, par conséquent, besoin de visiter l'ensemble de la table de comptage et de vivre les lignes une par une. Soit sera lente pour une grande table.

Notez que vous pouvez généralement extraire une bonne estimation à l'aide de requête outils d'optimisation, statistiques de la table, etc. Dans le cas de PostgreSQL, par exemple, vous pouvez analyser les données en sortie de l' explain count(*) from yourtable et d'obtenir une bonne estimation du nombre de lignes. Ce qui m'amène à votre deuxième question.

J'ai une table qui peut contenir des milliards de lignes [il a environ 15 colonnes]. Est-il une meilleure façon d'obtenir le nombre EXACT de le nombre de lignes d'une table?

Sérieusement? :-) Vous vraiment dire l' exact compter à partir d'une table avec des milliards de lignes? Êtes-vous vraiment sûr? :-)

Si vous avez vraiment le faire, vous pouvez garder une trace de la total à l'aide de déclencheurs, mais l'esprit de la simultanéité et de blocages si vous le faites.

5voto

Mainsh S Points 31

j'utilise

 select /*+ parallel(a) */  count(1) from table_name a;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X