更改表修改列与乘法值查询

时间:2012-10-10 10:50:49

标签: oracle alter

我的应用程序与Oracle数据库交互,其中一个表有100万条记录。问题是:

在该表中,我们有一个数字整数类型的列。我们想要存储浮点值(2位)。我们可以通过乘以100(来自应用程序)并将它们存储在该列中或修改列数据来实现type。问题是:

什么花费的时间更少? alter table修改列或查询(update table set column = 100 * val)。

2 个答案:

答案 0 :(得分:2)

Oracle中的NUMBER没有内在的“格式”,即其内部表示不依赖于其精度或比例。例如NUMBER 123456如果被声明为NUMBER(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)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

答案 1 :(得分:1)

您将无法修改现有列的数据类型:

ORA-01439:要修改的列必须为空才能更改数据类型

因此,如果你想要浮点列,你需要创建一个,用整数列的数据更新它,然后删除整数列。 DDL很快,但更新1M行需要时间。您可能希望将其限制为50000行并在每次更新后提交,这样会更快:

UPDATE MyTable SET NewFloatField = OldINtegerField WHERE NewFloatField IS NULL AND rownum< 50000

您可以采用另一种方式更改应用程序中的SQL并在插入数据时乘以100,并在检索数据时除以100。但是,我会修改数据库以使数据来自一个源,而无需在插入或读取数据的所有位置进行解释。