Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-如何获得特定行的实际大小?_Oracle_Size_Row - Fatal编程技术网

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

Oracle-如何获得特定行的实际大小?,oracle,size,row,Oracle,Size,Row,这可能吗?或者至少我希望有一个表中所有行大小的列表 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_length_函数,请参见此如果您对平均行长度感兴趣,您可以分析表(使用DBMS_STATS包),然后查询所有表。avg

这可能吗?或者至少我希望有一个表中所有行大小的列表

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_length_函数,请参见此

如果您对平均行长度感兴趣,您可以分析表(使用DBMS_STATS包),然后查询
所有表。avg_row_leng
下面是我修改的查询,以在您没有任何数据时获取表行长度。这可以帮助您进行环境设置的容量规划:

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;
/

对于代码中的任意示例,
herp/derp
是否替换了
foo/bar
herp/derp
明显更具贬义,因此我认为不是。谢谢,但是如果其中一列是长的原始列呢?用我的bad替换vsize。请注意,它返回的值可能低于以字节为单位的列长度总和。它是否反映了平均行占用的实际磁盘存储空间?@olexa:似乎
avg_row_len
列考虑了磁盘空间。在大多数情况下,它应该大于单个列大小之和的平均值,因为列级别的开销很小(例如:空值不在行末尾时占用空间)。当然,如果您使用压缩,它可能会更低。