我的应用程序与一个表有 100 万条记录的 Oracle 数据库进行交互。问题是:
在该表中,我们有一列用于数字整数类型。我们想要存储浮点值(2 位)。我们可以通过乘以 100(来自应用程序)并将它们存储在该列中或修改列数据类型来做到这一点。问题是:
什么需要更少的时间?alter table modify 列或查询(update table set column = 100*val)。
Oracle 中的 ANUMBER
没有内在的“格式”,即它的内部表示不依赖于它的精度或规模。例如,如果将NUMBER
123456 声明为 aNUMBER(9,2)
或,则其内部表示方式相同INTEGER
:
SQL> SELECT dump(CAST(123456 AS INTEGER)) int,
2 dump(CAST(123456 AS NUMBER(9,2))) num
3 FROM dual;
INT NUM
------------------------- --------------------
Typ=2 Len=4: 195,13,35,57 Typ=2 Len=4: 195,13,35,57
INTEGER(7)
an和 a之间的列中唯一的区别NUMBER(9,2)
是INTEGER(7)
具有更强的检查约束。两列将以完全相同的方式在内部表示数据。
这就是为什么您可以毫无问题地提高ALTER TABLE
非空列的列的精度,并且只会修改元数据(字典表),因此应该是即时的,几乎不需要重做。
SQL> create table test (id number(7));
Table created.
SQL> insert into test values (123456);
1 row created.
SQL> alter table test modify (id number(9,2));
Table altered.
SQL> select * from test;
ID
----------
123456
您将无法修改现有列的数据类型:
ORA-01439: 要修改的列必须为空才能更改数据类型
因此,如果你想要浮点列,你需要创建一个,用你的整数列的数据更新它,然后删除整数列。DDL 很快,但是更新 1M 行需要时间。您可能希望将其限制为 50000 行并在每次更新后提交,这样会更快:
UPDATE MyTable SET NewFloatField = OldINtegerField WHERE NewFloatField IS NULL AND rownum < 50000
您可以采用另一种方式在应用程序中更改 SQL,并在插入数据时乘以 100,在检索数据时除以 100。但是,我会修改数据库以使数据来自一个来源,而无需在插入或读取数据的所有地方进行解释。