2011-05-03 11 views

Respuesta

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

para la long_raw_length_function, vea este Get the LENGTH of a LONG RAW

+0

es 'herp/derp' reemplazando' foo/bar' por ejemplos arbitrarios en el código? – xdumaine

+1

'herp/derp' es significativamente más despectivo, así que creo que no. –

+0

Gracias, pero ¿y si una de las columnas es un Raw largo? – danboh

5

si usted está interesado en la longitud media de registro, se puede analizar la mesa (con el paquete DBMS_STATS), a continuación, consulta ALL_TABLES.avg_row_len.

+0

Puede devolver un valor inferior a la suma de las longitudes de columna en bytes. ¿Refleja el espacio de almacenamiento en disco real tomado por una fila promedio? – Olexa

+1

@olexa: Parece que la columna 'avg_row_len' tiene en cuenta el [espacio real ocupado por los datos] (https: //asktom.oracle.com/pls/asktom/f? P = 100: 11: 0 :::: P11_QUESTION_ID: 1041629603947). En la mayoría de los casos, debe ser mayor que el promedio de la suma del tamaño de las columnas individuales, ya que hay una pequeña sobrecarga en el nivel de la columna (por ejemplo: los valores NULL ocupan espacio cuando no están al final de una fila). Por supuesto, si usa compresión, podría ser menor. –

3

A continuación se muestra la consulta que he modificado para obtener la longitud de la fila de la tabla cuando no hay datos. Esto puede ayudarlo con la planificación de capacidad para la configuración del entorno:

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