web-dev-qa-db-ja.com

Oracle-特定のROWの実際のサイズを取得するにはどうすればよいですか?

これは可能ですか?または、少なくとも、テーブル内のすべての行のサイズのリストを探しています。

13
danboh
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については、これを参照してください LONG RAWの長さを取得

18
bpgergo

平均行長に関心がある場合は、(DBMS_STATSパッケージを使用して)テーブルを分析してから、クエリALL_TABLES.avg_row_len

8
Vincent Malgrat

以下は、データがない場合にテーブルの行の長さを取得するために変更したクエリです。これは、環境設定の容量計画に役立ちます。

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