Oracle count (*) est de prendre trop de temps
J'ai essayé de récupérer le count(*)
de la table, qui a près de 7 millions de disques et de prendre plus d'une heure pour retourner le résultat.
Aussi le tableau a 153 les colonnes de l'index a été créé pour la colonne 123, ainsi essayé d'exécuter la requête suivante en parallèle, mais il n'a pas aidé.
select /*+ parallel (5) */ count(123) from <table_name>
Veuillez indiquer s'il y est de solution alternative.
Quand j'ai couru desc
sur la table en Crapaud, l'onglet index contient la valeur de pas de. de lignes. Aucune idée de la façon dont cette valeur est se jour là?
- je suppose par
count(123)
vous direcount(column_123)
, droit? select /*+ parallel (5) */ count(123) from
Je pense que vous avez la requête.- Avez-vous vu ceci : stackoverflow.com/questions/1840538/... ?
- oui Bohemain...sa colonne no. # 123
- Grâce Shinosha, je crois que ce serait faire le travail pour moi..SÉLECTIONNEZ NUM_ROWS DE ALL_TABLES OÙ TABLE_NAME = table_name; ...une idée de la fréquence à laquelle le comte est d'obtenir des mises à jour dans le tableau all_tables.
- Cela dépend de votre environnement @Brabin voir stackoverflow.com/questions/14125731/...
- qu'est-ce que la pratique de la tâche d'effectuer des Comptages réguliers sur un 7M lignes de la table?
- Plus d'une heure pour 7 millions d'enregistrements est vraiment trop long. Pourriez-vous nous montrer le plan d'exécution pour l'instruction select (exécuter une
explain plan for select ..... from <table_name>
, puis unselect * from table(dbms_xplan.display)
). Mon hypothèse est que votre 123-colonnes autorise les valeurs null (si l'index n'est pas utilisable pour le comptage) et que le tableau lui-même occupe de façon de plus d'espace que ce qui serait nécessaire, car une énorme quantité de données a été supprimée) - Il ne sonne comme trop long, mais à savoir si c'EST trop long (c'est à dire que quelque chose est faux) on a besoin de savoir si c'est un ordinateur dédié ou un serveur cloud avec plusieurs locataires, si il y a d'autres processus en cours d'exécution simultanément qui sont consommatrices de ressources de disque, etc.
- Avez-vous vraiment l'une colonne appelée "123" ou avez-vous changé le nom pour l'amour de soi? 153 les colonnes ne sembler beaucoup.
Vous devez vous connecter pour publier un commentaire.
Compter le nombre de lignes de la grande table prend beaucoup de temps. Il est naturel. Certains SGBD stocke le nombre d'enregistrements, cependant, ce genre de SGBD les limites de la simultanéité. Il doit verrouiller la totalité de la table avant l'opération DML sur la table. (L'ensemble de la table de verrouillage est nécessaire de mettre à jour le comte correctement.)
La valeur dans
ALL_TABLES.NUM_ROWS
(ouUSER_TABLES.NUM_ROWS
) est juste une statistique de l'information générée paranalyze table ...
oudbms_stats.gather_table_stats
procédure. Il n'est pas précis, pas d'information en temps réel.Si vous n'avez pas besoin de le nombre exact de lignes, vous pouvez utiliser les informations statistiques. Cependant vous ne devriez pas compter sur elle. Il est utilisé par l'optimiseur Oracle, mais ne devrait pas dans le programme d'application.
Je ne suis pas sûr pourquoi vous devez compter le nombre de lignes de la table.
Si vous en avez besoin dans le programme de commandes qui est exécuter rarement, vous pouvez partitionner la table pour augmenter le parallélisme.Si vous avez besoin de les compter dans le programme en ligne, vous devez trouver un moyen de ne pas utiliser le comte.Quelques questions à mentionner:
Semble que nombre impair pour le degré de parallélisme. Eh bien, évidentes 5 est un nombre impair, et que c'est étrange. Le DoPs devrait être un
alimentationmultiple de deux (voir ci-dessous pour plus de détails).De toute façon, avez-vous une raison pour l'utilisation de requêtes en parallèle? Avez-vous au moins cinq de rechange processeurs? Si non, il ya une bonne chance que les coûts de gestion de l'PQ esclaves est au moins de contribuer à la mauvaise performance.
Pourquoi DOP = n*2? Il est établi une heuristique basée sur la Théorie des files d'attente que l'exécution de plus de deux lots d'emplois simultanément conduit à une dégradation des performances. En savoir plus. (Je pense que la théorie des files d'attente en réalité recommande une valeur de 1,8, mais comme la base de données des emplois sont souvent liés par les I/O disque ou on peut généralement s'en tirer avec 2.)
J'ai d'abord dit "puissance 2", mais c'est principalement parce que le multi-core serveurs ont tendance à avoir un nombre de Processeurs qui est une puissance de 2, mais de multiples de 2 est plus précis, parce que certaines boîtes de 12 unités centrales ou un autre nombre.
Maintenant, si nous avons un core 64-fort, d'un DOP de 5 ou 37 est bien, parce que nous avons assez de Processeurs pour exécuter plusieurs threads simultanément. Mais si nous avons un petit quadcore boîte, seulement 2, 4 ou 8 de sens, car ce sont les seules valeurs qui permettra de garantir une répartition uniforme de travail à travers tous les quatre processeurs. Une course de cinq threads sur un quadcore case, un CPU sera fait beaucoup plus de travail que les trois autres; il y a une possibilité que cela va prendre plus de temps pour terminer, laissant les trois autres esclaves d'attente. Donc
DOP=5
peut effectivement conduire à un plus grand temps écoulé queDOP=4
.DOP=n*2
n'est qu'une règle de pouce, et pas gravé dans la pierre. Cependant, il est basé sur un raisonnement solide, et nous devons savoir pourquoi nous faisons quelque chose de différent. De toute évidence, nous devrions avoir effectué quelques expériences pour confirmer que nous avons choisi la bonne DOP (quelle que soit la valeur, nous nous installons sur).