特定列的数据消耗的空间以及对删除该列的影响

时间:2018-07-04 04:18:57

标签: database oracle oracle12c

我在项目中使用Oracle 12c数据库,并且具有类型"VARCHAR2(128 CHAR) NOT NULL "的“名称”列。我的表中大约有25328687行。

现在,我不需要“名称”列,因此我想将其删除。当我为所有行计算此列中数据的总大小(使用lengthb和vsize)时,大约为1.07 GB。

由于指定了此列中数据的最大大小,因此不是所有行都会为此列分配128个字节(为简化起见,忽略Unicode),并且此列消耗的总空间应为128 *行= 3242071936字节或3.24 GB。

3 个答案:

答案 0 :(得分:1)

Oracle Varchar2动态分配内存(定义表示可变长度字符串数据类型) Char数据类型是固定长度的字符串数据类型。

  public class AddUser extends JFrame {
    TUsers t = new TUsers();


AddUser()
{
    setTitle("Admin");
    setLocation(400,400);
    setSize(400, 400);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}

    void Layout()
  {
   getContentPane().add(t).setBounds(10, 225, 350, 150);
   //if i delete this it wont show the table

    setVisible(true);
  } 



    void EventHandle() 
   {
  b_crt.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent e)
        {
            Dbcon dc = new Dbcon();
            Connection psql = dc.getConnection();
            try
            {
                Statement stmt = psql.createStatement();
                String sql = "INSERT INTO public.patrons VALUES ('"
                            +t_id.getText()+"','"
                            +t_usrnm.getText()+"','"
                            +t_adrs.getText()+"');";
                int i = stmt.executeUpdate(sql);
                if(i == i) 
                {
                    JOptionPane.showMessageDialog(null, "Success");
                }
                Clear();
            }
            catch(Exception x)
            {
                JOptionPane.showMessageDialog(null, x.getMessage());
            }

            TUsers t = new TUsers();

         }
        });
   }
}   

答案 1 :(得分:0)

Oracle对varchar2进行动态分配。

如果一个字符集为一字节,那么一个4字符的字符串将占5个字节的长度,而4个字符则占4个字节。

答案 2 :(得分:0)

正如其他答案所说,VARCHAR2列使用的存储为 VAR 。要获得实际金额的估算值,可以使用

1)数据字典

SELECT column_name, avg_col_len, last_analyzed
  FROM ALL_TAB_COL_STATISTICS
 WHERE owner        = 'MY_SCHEMA'
   AND table_name   = 'MY_TABLE'
   AND column_name  = 'MY_COLUMN';   

结果avg_col_len是平均列长。将其乘以您的行数25328687,就可以估算出此列使用的字节数。 (如果last_analyzed与上次大数据更改相比为NULL或非常旧,则必须首先使用DBMS_STATS.GATHER_TABLE_STATS('MY_SCHEMA','MY_TABLE')刷新优化器统计信息。

2)在样本中计数自己

SELECT sum(s), count(*), avg(s), stddev(s)
  FROM (
        SELECT vsize(my_column) as s 
          FROM my_schema.my_table SAMPLE (0.1)
       );

这将计算表的0.1%样本的存储大小。

3)可以肯定地说,我将对一部分数据进行测试

CREATE TABLE my_test TABLESPACE my_scratch_tablespace NOLOGGING AS 
  SELECT * FROM my_schema.my_table SAMPLE (0.1);

-- get the size of the test table in megabytes
SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

-- now drop the column
ALTER TABLE my_test DROP (my_column);

-- and measure again
SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

-- check how much space will be freed up
ALTER TABLE my_test MOVE;

SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

您可以通过在测试表上使用相同的PCTFREECOMPRESSION级别来改进测试。