1

我的 TableA 有数十万行,而且大小仍在增加。没有分区,速度下降非常明显。

因此,我创建了一个名为 TableB 的新表,其列与 Oracle SQL Developer 中的(名称和类型)TableA 完全相同。(TableA 和 TableB 在同一个数据库中,但不是同一个表)我另外为 TableB 创建了分区。

现在,我要做的就是从 TableB 中复制 TableA 中的所有数据,以测试查询的速度。

为了测试带分区的表的速度,我决定复制所有数据,因为 TableB 与 A 具有所有相同的列。

insert into TableB ( select * from TableA);

我从上面的语句中所期望的是要复制的数据,但相反,我得到了错误:

从行开始的错误:命令中的 1 - 插入 TableB(从 TableA 中选择 *) 命令行错误:1 列:1 错误报告 - SQL 错误:ORA-54013:虚拟列 54013 上不允许插入操作。0000 -“插入操作”不允许在虚拟列上使用” *原因:试图将值插入到虚拟列中 *操作:重新发布声明而不为虚拟列提供值

我查了虚拟列,它似乎是

“查询时,虚拟列似乎是普通表列,但它们的值是派生的,而不是存储在磁盘上。定义虚拟列的语法如下所示。”

但是,我在 TableB 中没有任何数据。TableB 只有与 TableA 匹配的列,所以我不确定如何派生我的列,当没有什么可以派生的时候?

4

2 回答 2

3

您可以使用查询

SELECT column_name, virtual_column
  FROM user_tab_cols
 WHERE table_name = 'TABLEA';

COLUMN_NAME VIRTUAL_COLUMN
----------- --------------
ID          NO
COL1        NO
COL2        NO
COL3        YES

然后使用

INSERT INTO TABLEB(ID,COL1,COL2) SELECT ID,COL1,COL2 FROM TABLEA;

为了免除虚拟列,那些是从其他列的值计算出来的。

于 2019-02-11T15:00:29.987 回答
1

您是否也使用派生列创建了表 B?根据您的问题,我认为您也使用虚拟列创建了 tableB ..

您需要注意的一件事是,由于您要插入大量记录,因此请使用批量模式以加快操作速度。使用附加提示,如下所示。请注意 - 您不需要在下面的语句中包含虚拟列,因为它们是动态计算的。

insert  /*+ APPEND */   into tableB (column1, column2,...columnn) select column1, column2,...columnn from TableA
于 2019-02-11T15:20:39.923 回答