由于习惯了MSSQL
(并且可能会被它破坏),我想知道如何才能在Oracle
10g中获得表的大小。我已经用谷歌搜索过了,所以我现在意识到我可能没有sp_spaceused
那么简单的选择。尽管如此,我得到的潜在答案大多是过时的或不起作用的。可能是因为我不是正在使用的模式的DBA。
有人会有解决方案和/或建议吗?
发布于 2008-11-05 22:27:48
您可能会对此查询感兴趣。它告诉您在考虑索引和表上的任何LOB的情况下,为每个表分配了多少空间。通常,您感兴趣的不仅仅是表本身,而是“购买订单表占用了多少空间,包括任何索引”。你总是可以深入研究细节的。请注意,这需要访问DBA_*视图。
COLUMN TABLE_NAME FORMAT A32
COLUMN OBJECT_NAME FORMAT A32
COLUMN OWNER FORMAT A10
SELECT
owner,
table_name,
TRUNC(sum(bytes)/1024/1024) Meg,
ROUND( ratio_to_report( sum(bytes) ) over () * 100) Percent
FROM
(SELECT segment_name table_name, owner, bytes
FROM dba_segments
WHERE segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
UNION ALL
SELECT i.table_name, i.owner, s.bytes
FROM dba_indexes i, dba_segments s
WHERE s.segment_name = i.index_name
AND s.owner = i.owner
AND s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.segment_name
AND s.owner = l.owner
AND s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.index_name
AND s.owner = l.owner
AND s.segment_type = 'LOBINDEX')
WHERE owner in UPPER('&owner')
GROUP BY table_name, owner
HAVING SUM(bytes)/1024/1024 > 10 /* Ignore really small tables */
ORDER BY SUM(bytes) desc
;
发布于 2008-11-05 15:45:03
首先,我通常要注意的是,为了进行空间分析而收集表统计数据是一件潜在的危险事情。收集统计信息可能会更改查询计划,尤其是在DBA配置了一个使用调用未使用的非默认参数的统计信息收集作业的情况下,这将导致Oracle重新解析使用相关表的查询,这可能会影响性能。如果数据库管理员故意让某些表没有统计信息(如果选择了OPTIMIZER_MODE
,则通常是这样),收集统计信息可能会导致Oracle停止使用基于规则的优化器,而开始为一组查询使用基于成本的优化器,如果在生产中意外执行,这将是一个主要的性能难题。如果您的统计数据准确,则可以直接查询USER_TABLES
(或ALL_TABLES
或DBA_TABLES
),而无需调用GATHER_TABLE_STATS
。如果你的统计数据不准确,可能是有原因的,你不想破坏现状。
其次,与SQL Server sp_spaceused
过程最接近的等价物可能是Oracle的DBMS_SPACE
包。Tom Kyte有一个很好的show_space
procedure,它为这个包提供了一个简单的接口,并打印出类似于sp_spaceused
打印的信息。
发布于 2013-05-21 10:01:46
我修改了WW的查询以提供更详细的信息:
SELECT * FROM (
SELECT
owner, object_name, object_type, table_name, ROUND(bytes)/1024/1024 AS meg,
tablespace_name, extents, initial_extent,
ROUND(Sum(bytes/1024/1024) OVER (PARTITION BY table_name)) AS total_table_meg
FROM (
-- Tables
SELECT owner, segment_name AS object_name, 'TABLE' AS object_type,
segment_name AS table_name, bytes,
tablespace_name, extents, initial_extent
FROM dba_segments
WHERE segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
UNION ALL
-- Indexes
SELECT i.owner, i.index_name AS object_name, 'INDEX' AS object_type,
i.table_name, s.bytes,
s.tablespace_name, s.extents, s.initial_extent
FROM dba_indexes i, dba_segments s
WHERE s.segment_name = i.index_name
AND s.owner = i.owner
AND s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
-- LOB Segments
UNION ALL
SELECT l.owner, l.column_name AS object_name, 'LOB_COLUMN' AS object_type,
l.table_name, s.bytes,
s.tablespace_name, s.extents, s.initial_extent
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.segment_name
AND s.owner = l.owner
AND s.segment_type = 'LOBSEGMENT'
-- LOB Indexes
UNION ALL
SELECT l.owner, l.column_name AS object_name, 'LOB_INDEX' AS object_type,
l.table_name, s.bytes,
s.tablespace_name, s.extents, s.initial_extent
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.index_name
AND s.owner = l.owner
AND s.segment_type = 'LOBINDEX'
)
WHERE owner = UPPER('&owner')
)
WHERE total_table_meg > 10
ORDER BY total_table_meg DESC, meg DESC
/
https://stackoverflow.com/questions/264914
复制相似问题