如何使用新分区将数据从 TableA 复制到 TableB?
How to copy data from TableA to TableB with new partitions?
我的 TableA 有数十万行,而且大小还在增加。没有分区,速度下降得非常明显。
所以我创建了一个新的 table 名为 TableB 的列与 Oracle SQL Developer 中的 TableA 完全一样(名称和类型)。 (TableA 和 TableB 在同一个数据库中,但不相同 tables)我另外为 TableB 创建了分区。
现在,我只想将 TableA 中的所有数据复制到 TableB 中,以测试查询速度。
为了测试 tables 的分区速度,我决定复制所有数据,因为 TableB 具有与 A 相同的所有列。
insert into TableB ( select * from TableA);
我从上面的语句中期望的是要复制的数据,但我得到了错误:
错误从第 1 行开始 - 命令 -
插入 TableB(来自 TableA 的 select *)
命令行错误:1 列:1
错误报告 -
SQL 错误:ORA-54013:不允许对虚拟列执行 INSERT 操作
54013.0000 - "INSERT operation disallowed on virtual columns"
*原因:试图将值插入虚拟列
*行动:重新发布声明而不提供虚拟列的值
我查了一下 Virtual Columns 好像是
"When queried, virtual columns appear to be normal table columns, but their values are derived rather than being stored on disc. The syntax for defining a virtual column is listed below."
但是,我在 TableB 中没有任何数据。 TableB 只有与 TableA 匹配的列,所以我不确定如何导出我的列,当没有任何东西可以导出时?
您可以使用查询
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;
为了排除虚拟列,那些是根据其他列的值计算出来的。
您是否也使用派生列创建了 table B?根据你的问题,我假设你创建了 tableB 也有虚拟列..
您需要注意的一件事是,因为您要插入大量记录,请使用批量模式以加快操作速度。使用附加提示,如下所示。
请注意 - 您无需在以下语句中包含虚拟列,因为它们会即时计算。
insert /*+ APPEND */ into tableB (column1, column2,...columnn) select column1, column2,...columnn from TableA
我的 TableA 有数十万行,而且大小还在增加。没有分区,速度下降得非常明显。
所以我创建了一个新的 table 名为 TableB 的列与 Oracle SQL Developer 中的 TableA 完全一样(名称和类型)。 (TableA 和 TableB 在同一个数据库中,但不相同 tables)我另外为 TableB 创建了分区。
现在,我只想将 TableA 中的所有数据复制到 TableB 中,以测试查询速度。
为了测试 tables 的分区速度,我决定复制所有数据,因为 TableB 具有与 A 相同的所有列。
insert into TableB ( select * from TableA);
我从上面的语句中期望的是要复制的数据,但我得到了错误:
错误从第 1 行开始 - 命令 - 插入 TableB(来自 TableA 的 select *) 命令行错误:1 列:1 错误报告 - SQL 错误:ORA-54013:不允许对虚拟列执行 INSERT 操作 54013.0000 - "INSERT operation disallowed on virtual columns" *原因:试图将值插入虚拟列 *行动:重新发布声明而不提供虚拟列的值
我查了一下 Virtual Columns 好像是
"When queried, virtual columns appear to be normal table columns, but their values are derived rather than being stored on disc. The syntax for defining a virtual column is listed below."
但是,我在 TableB 中没有任何数据。 TableB 只有与 TableA 匹配的列,所以我不确定如何导出我的列,当没有任何东西可以导出时?
您可以使用查询
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;
为了排除虚拟列,那些是根据其他列的值计算出来的。
您是否也使用派生列创建了 table B?根据你的问题,我假设你创建了 tableB 也有虚拟列..
您需要注意的一件事是,因为您要插入大量记录,请使用批量模式以加快操作速度。使用附加提示,如下所示。 请注意 - 您无需在以下语句中包含虚拟列,因为它们会即时计算。
insert /*+ APPEND */ into tableB (column1, column2,...columnn) select column1, column2,...columnn from TableA