【问题标题】:Oracle - How do I get the actual size of a specific ROW?Oracle - 如何获得特定 ROW 的实际大小?
【发布时间】:2011-05-03 14:51:32
【问题描述】:

这可能吗?或者至少我正在寻找一个表格中所有行大小的列表。

【问题讨论】:

    标签: oracle size row


    【解决方案1】:
    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_function,请参见Get the LENGTH of a LONG RAW

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它可能返回比列长度总和更低的值(以字节为单位)。它是否反映了平均行占用的实际磁盘存储空间?
    • @olexa:似乎avg_row_len 列考虑了actual space occupied by data。在大多数情况下,它应该大于各个列大小总和的平均值,因为列级别的开销很小(例如:NULL 值在不在行尾时占用空间)。当然,如果您使用压缩,它可能会更低。
    【解决方案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;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2021-11-17
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多