Étant habitué (et potentiellement gâté par) MSSQL, je me demande comment je peux obtenir la taille des tables dans Oracle 10g. Je l'ai googlé donc je suis maintenant conscient que je n'ai peut-être pas une option aussi simple que sp_spaceused. Pourtant, les réponses potentielles que j'ai obtenues sont la plupart du temps dépassées ou ne fonctionnent pas. Probablement parce que je ne suis pas DBA sur le schéma avec lequel je travaille.
Quelqu'un aurait-il des solutions et / ou des recommandations?
Réponses:
Vous pourriez être intéressé par cette requête. Il vous indique la quantité d'espace allouée à chaque table en tenant compte des index et des LOB de la table. Souvent, vous êtes intéressé de savoir "combien d'espaces la table de bon de commande prend, y compris les index" plutôt que simplement la table elle-même. Vous pouvez toujours vous plonger dans les détails. Notez que cela nécessite l'accès aux vues DBA_ *.
la source
la source
null
(num_rows
,avg_row_len
), vous devez faire une analyse avant via la déclaration suivanteANALYZE TABLE your_table COMPUTE STATISTICS
Tout d'abord, je voudrais généralement avertir que la collecte de statistiques de table afin de faire une analyse d'espace est une chose potentiellement dangereuse à faire. La collecte de statistiques peut modifier les plans de requête, en particulier si l'administrateur de base de données a configuré un travail de collecte de statistiques qui utilise des paramètres non par défaut que votre appel n'utilise pas, et obligera Oracle à réexaminer les requêtes qui utilisent la table en question, ce qui peut être une performance frappé. Si l'administrateur de base de données a intentionnellement laissé certaines tables sans statistiques (courant si vous
OPTIMIZER_MODE
choisissez), la collecte de statistiques peut amener Oracle à cesser d'utiliser l'optimiseur basé sur des règles et à commencer à utiliser l'optimiseur basé sur les coûts pour un ensemble de requêtes qui peuvent être une performance majeure mal de tête si cela est fait de manière inattendue en production. Si vos statistiques sont exactes, vous pouvez interrogerUSER_TABLES
(ouALL_TABLES
ouDBA_TABLES
) directement sans appelerGATHER_TABLE_STATS
. Si vos statistiques ne sont pas exactes, il y a probablement une raison à cela et vous ne voulez pas perturber le statu quo.Deuxièmement, l'équivalent le plus proche de la
sp_spaceused
procédure SQL Server est probablement leDBMS_SPACE
package d'Oracle . Tom Kyte a uneshow_space
procédure intéressante qui fournit une interface simple à ce package et imprime des informations similaires à cellessp_spaceused
imprimées.la source
Tout d'abord, rassemblez les statistiques de l'optimiseur sur la table (si vous ne l'avez pas déjà fait):
AVERTISSEMENT: comme Justin le dit dans sa réponse, la collecte des statistiques de l'optimiseur affecte l'optimisation des requêtes et ne doit pas être effectuée sans le soin et la considération !
Trouvez ensuite le nombre de blocs occupés par la table à partir des statistiques générées:
Le nombre total de blocs alloués à la table est de blocs + empty_blocks + num_freelist_blocks.
blocs est le nombre de blocs qui contiennent réellement des données.
Multipliez le nombre de blocs par la taille du bloc utilisé (généralement 8 Ko) pour obtenir l'espace consommé - par exemple 17 blocs x 8 Ko = 136 Ko.
Pour faire cela pour toutes les tables d'un schéma à la fois:
Remarque: les modifications apportées à ce qui précède après la lecture de ce fil AskTom
la source
J'ai modifié la requête de WW pour fournir des informations plus détaillées:
la source
Pour les tables et index sous-partitionnés, nous pouvons utiliser la requête suivante
la source
IIRC les tables dont vous avez besoin sont DBA_TABLES, DBA_EXTENTS ou DBA_SEGMENTS et DBA_DATA_FILES. Il existe également des versions USER_ et ALL_ de celles-ci pour les tables que vous pouvez voir si vous ne disposez pas des autorisations d'administration sur la machine.
la source
Voici une variante de la réponse WW, elle comprend des partitions et des sous-partitions comme d'autres l'ont suggéré ci-dessus, plus une colonne pour afficher le TYPE: Table / Index / LOB, etc.
la source
la source
J'ai modifié la requête pour obtenir la taille du schéma par tablespace.
la source
Cela dépend de ce que vous entendez par «taille de la table». Une table ne concerne pas un fichier spécifique du système de fichiers. Une table résidera sur un tablespace (éventuellement plusieurs tablespaces si elle est partitionnée, et éventuellement plusieurs tablespaces si vous souhaitez également prendre en compte les index sur la table). Un tablespace contient souvent plusieurs tables et peut être réparti sur plusieurs fichiers.
Si vous estimez l'espace dont vous aurez besoin pour la croissance future de la table, avg_row_len multiplié par le nombre de lignes de la table (ou le nombre de lignes que vous attendez dans la table) sera un bon guide. Mais Oracle laissera de l'espace libre sur chaque bloc, en partie pour permettre aux lignes de `` grossir '' si elles sont mises à jour, en partie parce qu'il ne sera peut-être pas possible d'ajuster une autre ligne entière sur ce bloc (par exemple, un bloc de 8K ne contiendrait que 2 lignes de 3K, bien que ce soit un exemple extrême car 3K est beaucoup plus grand que la plupart des tailles de lignes). Ainsi, BLOCKS (dans USER_TABLES) pourrait être un meilleur guide.
Mais si vous aviez 200 000 lignes dans une table, supprimiez la moitié d'entre elles, la table «posséderait» toujours le même nombre de blocs. Il ne les libère pas pour que d'autres tables les utilisent. De plus, les blocs ne sont pas ajoutés individuellement à une table, mais dans des groupes appelés «étendue». Donc, il y aura généralement EMPTY_BLOCKS (également dans USER_TABLES) dans une table.
la source
Correction pour les tables partitionnées:
la source
Sélection simple qui renvoie les tailles brutes des tables, en fonction de la taille du bloc, inclut également la taille avec index
select table_name, (nvl ((select sum (blocks) from dba_indexes a, dba_segments b où a.index_name = b.segment_name et a.table_name = dba_tables.table_name), 0) + blocks) * 8192/1024 TotalSize, blocks * 8 tableSize à partir de dba_tables triés par 3
la source
J'ai trouvé que c'était un peu plus précis:
la source
la source
il y a une autre option qui permet d'obtenir la taille "select" avec les jointures, et la taille de la table en option aussi
la source
J'ai la même variante que les derniers qui calculent les segments de données de table, les index de table et les champs blob:
Source .
la source