在 Oracle 中,要查询表的大小、索引的大小、分区的大小、大字段(LOBs)的 ...

打印 上一主题 下一主题

主题 979|帖子 979|积分 2937

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

查询表的大小可以使用 DBA_SEGMENTS 视图:
  1. SELECT
  2.     segment_name AS "Table_Name",
  3.     SUM(bytes) / (1024 * 1024) AS "Size_MB"
  4. FROM
  5.     dba_segments
  6. WHERE
  7.     segment_type = 'TABLE'
  8. GROUP BY
  9.     segment_name;
复制代码
2. 索引的大小

查询索引的大小可以使用 DBA_INDEXES 和 DBA_SEGMENTS 视图:
  1. SELECT
  2.     index_name AS "Index_Name",
  3.     SUM(bytes) / (1024 * 1024) AS "Size_MB"
  4. FROM
  5.     dba_indexes i,
  6.     dba_segments s
  7. WHERE
  8.     i.index_name = s.segment_name AND
  9.     s.segment_type = 'INDEX'
  10. GROUP BY
  11.     index_name;
复制代码
3. 分区的大小

假如表是分区的,可以查询分区的大小:
  1. SELECT
  2.     table_name,
  3.     partition_name,
  4.     SUM(bytes) / (1024 * 1024) AS "Size_MB"
  5. FROM
  6.     dba_tab_partitions
  7. GROUP BY
  8.     table_name, partition_name;
复制代码
4. 大字段(LOBs)的大小

查询 LOB 字段的大小可以使用 DBA_LOBS 视图:
  1. SELECT
  2.     table_name,
  3.     column_name,
  4.     SUM(bytes) / (1024 * 1024) AS "Size_MB"
  5. FROM
  6.     dba_lobs
  7. GROUP BY
  8.     table_name, column_name;
复制代码
5. 单表占用空间的总大小

为了得到单个表及其索引和分区的总大小,您可以联合上述查询的效果:
  1. WITH Table_Size AS (
  2.     SELECT
  3.         segment_name AS "Table_Name",
  4.         SUM(bytes) / (1024 * 1024) AS "Table_Size_MB"
  5.     FROM
  6.         dba_segments
  7.     WHERE
  8.         segment_type = 'TABLE'
  9.     GROUP BY
  10.         segment_name
  11. ),
  12. Index_Size AS (
  13.     SELECT
  14.         i.index_name AS "Index_Name",
  15.         SUM(s.bytes) / (1024 * 1024) AS "Index_Size_MB"
  16.     FROM
  17.         dba_indexes i,
  18.         dba_segments s
  19.     WHERE
  20.         i.index_name = s.segment_name AND
  21.         s.segment_type = 'INDEX'
  22.     GROUP BY
  23.         i.index_name
  24. ),
  25. Partition_Size AS (
  26.     SELECT
  27.         table_name,
  28.         SUM(bytes) / (1024 * 1024) AS "Partition_Size_MB"
  29.     FROM
  30.         dba_tab_partitions
  31.     GROUP BY
  32.         table_name
  33. )
  34. SELECT
  35.     t."Table_Name",
  36.     COALESCE(t."Table_Size_MB", 0) AS "Table_Size_MB",
  37.     COALESCE(i."Index_Size_MB", 0) AS "Index_Size_MB",
  38.     COALESCE(p."Partition_Size_MB", 0) AS "Partition_Size_MB",
  39.     (COALESCE(t."Table_Size_MB", 0) + COALESCE(i."Index_Size_MB", 0) + COALESCE(p."Partition_Size_MB", 0)) AS "Total_Size_MB"
  40. FROM
  41.     Table_Size t
  42. LEFT JOIN
  43.     Index_Size i ON t."Table_Name" = REGEXP_SUBSTR(i."Index_Name", '^.*_IDX$')
  44. LEFT JOIN
  45.     Partition_Size p ON t."Table_Name" = p.table_name;
复制代码
请注意,上述查询假设索引名称遵照某种定名模式,比方以 _IDX 末端。假如您的索引定名规则不同,请根据现实情况调整 REGEXP_SUBSTR 函数中的正则表达式。
以上查询可以根据您的需求进行调整。假如您需要进一步的帮助

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表