我在项目中使用Oracle 12c数据库,并且具有类型"VARCHAR2(128 CHAR) NOT NULL "
的“名称”列。我的表中大约有25328687行。
现在,我不需要“名称”列,因此我想将其删除。当我为所有行计算此列中数据的总大小(使用lengthb和vsize)时,大约为1.07 GB。
由于指定了此列中数据的最大大小,因此不是所有行都会为此列分配128个字节(为简化起见,忽略Unicode),并且此列消耗的总空间应为128 *行= 3242071936字节或3.24 GB。
答案 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';
您可以通过在测试表上使用相同的PCTFREE
和COMPRESSION
级别来改进测试。