在 Oracle 中,要查询表的大小、索引的大小、分区的大小、大字段(LOBs)的大小以及单个表占用的空间总大小

在 Oracle 中,要查询表的大小、索引的大小、分区的大小、大字段(LOBs)的大小以及单个表占用的空间总大小,您可以使用以下 SQL 查询。请注意,这些查询需要您具有足够的权限来访问 Oracle 的数据字典视图。

1. 表的大小

查询表的大小可以使用 DBA_SEGMENTS 视图:

SELECT 
    segment_name AS "Table_Name",
    SUM(bytes) / (1024 * 1024) AS "Size_MB"
FROM 
    dba_segments
WHERE 
    segment_type = 'TABLE'
GROUP BY 
    segment_name;

2. 索引的大小

查询索引的大小可以使用 DBA_INDEXESDBA_SEGMENTS 视图:

SELECT 
    index_name AS "Index_Name",
    SUM(bytes) / (1024 * 1024) AS "Size_MB"
FROM 
    dba_indexes i,
    dba_segments s
WHERE 
    i.index_name = s.segment_name AND
    s.segment_type = 'INDEX'
GROUP BY 
    index_name;

3. 分区的大小

如果表是分区的,可以查询分区的大小:

SELECT 
    table_name,
    partition_name,
    SUM(bytes) / (1024 * 1024) AS "Size_MB"
FROM 
    dba_tab_partitions
GROUP BY 
    table_name, partition_name;

4. 大字段(LOBs)的大小

查询 LOB 字段的大小可以使用 DBA_LOBS 视图:

SELECT 
    table_name,
    column_name,
    SUM(bytes) / (1024 * 1024) AS "Size_MB"
FROM 
    dba_lobs
GROUP BY 
    table_name, column_name;

5. 单表占用空间的总大小

为了得到单个表及其索引和分区的总大小,您可以结合上述查询的结果:

WITH Table_Size AS (
    SELECT 
        segment_name AS "Table_Name",
        SUM(bytes) / (1024 * 1024) AS "Table_Size_MB"
    FROM 
        dba_segments
    WHERE 
        segment_type = 'TABLE'
    GROUP BY 
        segment_name
),
Index_Size AS (
    SELECT 
        i.index_name AS "Index_Name",
        SUM(s.bytes) / (1024 * 1024) AS "Index_Size_MB"
    FROM 
        dba_indexes i,
        dba_segments s
    WHERE 
        i.index_name = s.segment_name AND
        s.segment_type = 'INDEX'
    GROUP BY 
        i.index_name
),
Partition_Size AS (
    SELECT 
        table_name,
        SUM(bytes) / (1024 * 1024) AS "Partition_Size_MB"
    FROM 
        dba_tab_partitions
    GROUP BY 
        table_name
)
SELECT 
    t."Table_Name",
    COALESCE(t."Table_Size_MB", 0) AS "Table_Size_MB",
    COALESCE(i."Index_Size_MB", 0) AS "Index_Size_MB",
    COALESCE(p."Partition_Size_MB", 0) AS "Partition_Size_MB",
    (COALESCE(t."Table_Size_MB", 0) + COALESCE(i."Index_Size_MB", 0) + COALESCE(p."Partition_Size_MB", 0)) AS "Total_Size_MB"
FROM 
    Table_Size t
LEFT JOIN 
    Index_Size i ON t."Table_Name" = REGEXP_SUBSTR(i."Index_Name", '^.*_IDX$')
LEFT JOIN 
    Partition_Size p ON t."Table_Name" = p.table_name;

请注意,上述查询假设索引名称遵循某种命名模式,例如以 _IDX 结尾。如果您的索引命名规则不同,请根据实际情况调整 REGEXP_SUBSTR 函数中的正则表达式。

以上查询可以根据您的需求进行调整。如果您需要进一步的帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值