Al estar acostumbrado (y potencialmente estropeado) a MSSQL, me pregunto cómo puedo llegar al tamaño de las tablas en Oracle 10g. Lo busqué en Google, así que ahora sé que es posible que no tenga una opción tan fácil como sp_spaceused. Aún así, las posibles respuestas que obtuve están desactualizadas la mayoría de las veces o no funcionan. Probablemente porque no soy un DBA en el esquema con el que estoy trabajando.
¿Alguien tendría soluciones o recomendaciones?
Respuestas:
Quizás te interese esta consulta. Le indica cuánto espacio se asigna para cada tabla teniendo en cuenta los índices y cualquier LOB en la tabla. A menudo le interesa saber "Cuántos espacios ocupa la tabla de órdenes de compra, incluidos los índices" en lugar de solo la tabla en sí. Siempre puedes profundizar en los detalles. Tenga en cuenta que esto requiere acceso a las vistas DBA_ *.
fuente
fuente
null
(num_rows
,avg_row_len
), debe realizar un análisis antes a través de la siguiente declaraciónANALYZE TABLE your_table COMPUTE STATISTICS
En primer lugar, generalmente advertiría que recopilar estadísticas de la tabla para hacer análisis de espacio es algo potencialmente peligroso. La recopilación de estadísticas puede cambiar los planes de consulta, especialmente si el DBA ha configurado un trabajo de recopilación de estadísticas que utiliza parámetros no predeterminados que su llamada no está utilizando, y hará que Oracle vuelva a analizar las consultas que utilizan la tabla en cuestión, lo que puede ser un rendimiento golpear. Si el DBA ha dejado intencionalmente algunas tablas sin estadísticas (común si su
OPTIMIZER_MODE
ESCOGER), la recopilación de estadísticas puede hacer que Oracle deje de usar el optimizador basado en reglas y comience a usar el optimizador basado en costos para un conjunto de consultas que pueden ser un rendimiento importante dolor de cabeza si se hace inesperadamente en producción. Si sus estadísticas son precisas, puede consultarUSER_TABLES
(ALL_TABLES
oDBA_TABLES
) directamente sin llamarGATHER_TABLE_STATS
. Si sus estadísticas no son precisas, probablemente haya una razón para eso y no desee alterar el statu quo.En segundo lugar, el equivalente más cercano al
sp_spaceused
procedimiento de SQL Server es probablemente elDBMS_SPACE
paquete de Oracle . Tom Kyte tiene un buenshow_space
procedimiento que proporciona una interfaz simple para este paquete e imprime información similar a la que sesp_spaceused
imprime.fuente
Primero, reúna las estadísticas del optimizador en la mesa (si aún no lo ha hecho):
ADVERTENCIA: como dice Justin en su respuesta, la recopilación de estadísticas del optimizador afecta la optimización de consultas y no debe hacerse sin el debido cuidado y consideración .
Luego encuentre el número de bloques ocupados por la tabla de las estadísticas generadas:
El número total de bloques asignados a la tabla es blocks + empty_blocks + num_freelist_blocks.
bloques es el número de bloques que realmente contienen datos.
Multiplique el número de bloques por el tamaño de bloque en uso (generalmente 8 KB) para obtener el espacio consumido, por ejemplo, 17 bloques x 8 KB = 136 KB.
Para hacer esto para todas las tablas de un esquema a la vez:
Nota: Los cambios realizados en lo anterior después de leer este hilo de AskTom
fuente
Modifiqué la consulta de WW para proporcionar información más detallada:
fuente
Para tablas e índices subdivididos podemos usar la siguiente consulta
fuente
IIRC las tablas que necesita son DBA_TABLES, DBA_EXTENTS o DBA_SEGMENTS y DBA_DATA_FILES. También hay versiones USER_ y ALL_ de estas para las tablas que puede ver si no tiene permisos de administración en la máquina.
fuente
Heres una variante en la respuesta WWs, incluye particiones y subparticiones como otros han sugerido anteriormente, además de una columna para mostrar el TIPO: Tabla / Índice / LOB, etc.
fuente
fuente
Modifiqué la consulta para obtener el tamaño del esquema por espacio de tabla.
fuente
Depende de lo que quieras decir con "tamaño de la mesa". Una tabla no se relaciona con un archivo específico en el sistema de archivos. Una tabla residirá en un espacio de tabla (posiblemente múltiples espacios de tabla si está particionado, y posiblemente múltiples espacios de tabla si también desea tener en cuenta los índices en la tabla). Un espacio de tabla a menudo tendrá varias tablas y puede extenderse a través de múltiples archivos.
Si está calculando cuánto espacio necesitará para el crecimiento futuro de la tabla, entonces avg_row_len multiplicado por el número de filas en la tabla (o el número de filas que espera en la tabla) será una buena guía. Pero Oracle dejará algo de espacio libre en cada bloque, en parte para permitir que las filas 'crezcan' si se actualizan, en parte porque puede que no sea posible colocar otra fila completa en ese bloque (por ejemplo, un bloque de 8K solo cabría en 2 filas de 3K, aunque eso sería un ejemplo extremo ya que 3K es mucho más grande que la mayoría de los tamaños de fila). Entonces BLOQUES (en USER_TABLES) podría ser una mejor guía.
Pero si tuviera 200,000 filas en una tabla, eliminara la mitad de ellas, entonces la tabla todavía 'poseería' la misma cantidad de bloques. No los libera para que otras tablas los usen. Además, los bloques no se agregan a una tabla individualmente, sino en grupos llamados 'extensión'. Por lo tanto, generalmente habrá EMPTY_BLOCKS (también en USER_TABLES) en una tabla.
fuente
Corrección para tablas particionadas:
fuente
La selección simple que devuelve los tamaños sin formato de las tablas, en función del tamaño del bloque, también incluye el tamaño con el índice
select table_name, (nvl ((select sum (blocks) from dba_indexes a, dba_segments b where a.index_name = b.segment_name and a.table_name = dba_tables.table_name), 0) + blocks) * 8192/1024 TotalSize, blocks * 8 tableSize de dba_tables ordenado por 3
fuente
Encontré que esto es un poco más preciso:
fuente
fuente
Hay una opción más que permite obtener el tamaño de "selección" con combinaciones, y el tamaño de la tabla como opción también
fuente
Tengo la misma variante que las últimas que calcula segmentos de datos de tabla, índices de tabla y campos de blob:
Fuente .
fuente