Oracle - 如何获取特定行的实际大小?

19

这样做可能吗?或者至少我想要一个包含表中每一行大小的列表。

3个回答

28
select vsize(col1) + vsize(col2) + vsize(col3) + 
long_raw_length_function(long_col) + DBMS_LOB.GETLENGTH(blob_col) 
from table 
where id_col = id_val;

查看 获取LONG RAW的长度,可了解有关long_raw_length_function函数的详细信息。


在编程中,herp/derp是否替换了foo/bar作为代码中的任意示例? - xdumaine
1
"herp/derp" 这个词汇含义更加贬低,所以我认为不要使用。 - Adam Musch
1
使用UTL_RAW.LENGTH(derpy_long_col);替换vsize。 - bpgergo
SQL错误:ORA-00997:LONG数据类型的使用非法。 - danboh
2
我的错。请查看此链接:https://dev59.com/ZVXTa4cB1Zd3GeqP4sBB#5497260 - bpgergo
显示剩余3条评论

10

如果您对平均行长度感兴趣,可以使用DBMS_STATS包分析表,然后查询ALL_TABLES.avg_row_len


它可能会返回比字节列长度之和更低的值。 这是否反映了平均行占用的实际磁盘存储空间? - Olexa
3
@olexa:看起来avg_row_len列考虑了实际占用数据的空间。在大多数情况下,它应该比单个列大小之和的平均值要大,因为在列级别上有一些小的开销(例如:当NULL值不在行末时会占用空间)。当然,如果您使用压缩,则可能会更低。 - Vincent Malgrat

3
以下是我修改后的查询,用于在没有数据时获取表行长度。这可以帮助您进行环境设置的容量规划:
SET serveroutput ON linesize 300
DECLARE
  v_max_size       NUMBER := 0;
  v_owner          VARCHAR2(30);
  v_table_name     VARCHAR2(30);
  v_data_type      VARCHAR2(30);
  v_data_length    NUMBER := 0;
  v_data_precision NUMBER := 0;
  CURSOR CUR_TABLE
  IS
    SELECT DISTINCT table_name
    FROM all_tab_columns
    WHERE owner='TMS_OWNER'
    AND table_name NOT LIKE 'VIEW%'
    ORDER BY table_name;
BEGIN
  FOR Tab IN CUR_TABLE
  LOOP
    v_table_name := Tab.table_name;
    v_max_size   := 0;
    FOR i        IN
    (SELECT owner,
      table_name,
      data_type,
      data_length,
      data_precision
    FROM all_tab_columns
    WHERE owner    ='TMS_OWNER'
    AND table_name = v_table_name
    )
    LOOP
      IF i.data_type = 'NUMBER' THEN
        v_max_size  := (v_max_size + i.data_precision);
      ELSE
        v_max_size := (v_max_size + i.data_length);
      END IF;
    END LOOP;
    dbms_output.put_line(chr(10));
    dbms_output.put_line('Table ='||v_table_name||', Max Record Size = '||v_max_size||' bytes');
  END LOOP;
END;
/

它并没有回答主题的问题,因为请求的是特定行的物理大小。这个脚本只会显示基于字典的理论逻辑最大尺寸,而不是特定行的最大物理尺寸。 - D. Lohrsträter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接