问题描述
我需要在大表的每一行上做一个繁重的操作。
为了通过paraleize这项工作,我创建了一个表,从原始表中获取rowid(C1) 并添加数字字段 'c2'。如果C2 = 0,则该行尚未处理,如果2C = 1,则该行已处理。
desc lanza
名称为空?类型
C1 ROWID
C2号
每个过程:
锁定表
取n行
更新此行c2 = 1
释放锁
拿rowid的原始表
处理这一行
而有c = 0的行
这是代码:
循环
独享模式下锁定表lanza;
选择rowid批量收集到filas1
来自兰扎
其中c2 = 0和
rownum <1000;
如果filas1.last为null
然后
提交;
退出;
如果结束;
更新lanza集c2 = 1
其中rowid在 (选择 *
从表 (cast(filas1作为filas);
提交;
选择c1批量收集到filas2中
来自兰扎
其中rowid在 (选择 *
从表 (cast(filas1作为filas);
做一些事情...
end 循环;
问题出在类型lista上的声明中。
我不能声明为:
SQL> 创建或替换类型filas是rowid的表;
2/
警告: 使用编译错误创建的类型。
SQL> 显示错误
FILAS类型错误:
行/列错误
-
0/0 PL/SQL: 编译单元分析终止
1/24 PLS-00531: VARRAY或表类型中不受支持的类型: 'ROWID'。
如果我声明这是:
创建或替换类型filas是varchar2(18) 的表;
/
select的执行计划为:
计划 _ 表 _ 输出
-
SQL_ID f5x5vts2ht6rr,子号0
-------------------------------------
更新LANZA集C2 = 1,其中ROWID在 (从表中选择 * (强制转换 (:B1为
FILAS)
计划哈希值: 4255393934
-
| Id | 操作 | 名称 | E行 | OMem | 1Mem | 二手-Mem |
-
| 0 | 更新语句 |
计划 _ 表 _ 输出
--
| 1 | 更新 | 兰扎 |
| * 2 | 哈希连接半 | | 1 | 650M | 32M | 752M (0)|
| 3 | 表访问完全 | LANZA | 1 |
| 4 | 集合迭代器PICKLER FETCH | | 999 |
-
谓词信息 (由操作id标识):
---------------------------------------------------
2-访问 (ROWID = CHARTOROWID (值 (KOKBF $)
计划 _ 表 _ 输出
----
-警告: 基本计划统计信息不可用。这些仅在以下情况下收集:
* 提示 “gather_plan_statistics” 用于语句或
* 参数 “statistic_level” 设置为 “全部”,在会话或系统级别
为了避免全面扫描,我应该如何做?
问候。
为了通过paraleize这项工作,我创建了一个表,从原始表中获取rowid(C1) 并添加数字字段 'c2'。如果C2 = 0,则该行尚未处理,如果2C = 1,则该行已处理。
desc lanza
名称为空?类型
C1 ROWID
C2号
每个过程:
锁定表
取n行
更新此行c2 = 1
释放锁
拿rowid的原始表
处理这一行
而有c = 0的行
这是代码:
循环
独享模式下锁定表lanza;
选择rowid批量收集到filas1
来自兰扎
其中c2 = 0和
rownum <1000;
如果filas1.last为null
然后
提交;
退出;
如果结束;
更新lanza集c2 = 1
其中rowid在 (选择 *
从表 (cast(filas1作为filas);
提交;
选择c1批量收集到filas2中
来自兰扎
其中rowid在 (选择 *
从表 (cast(filas1作为filas);
做一些事情...
end 循环;
问题出在类型lista上的声明中。
我不能声明为:
SQL> 创建或替换类型filas是rowid的表;
2/
警告: 使用编译错误创建的类型。
SQL> 显示错误
FILAS类型错误:
行/列错误
-
0/0 PL/SQL: 编译单元分析终止
1/24 PLS-00531: VARRAY或表类型中不受支持的类型: 'ROWID'。
如果我声明这是:
创建或替换类型filas是varchar2(18) 的表;
/
select的执行计划为:
计划 _ 表 _ 输出
-
SQL_ID f5x5vts2ht6rr,子号0
-------------------------------------
更新LANZA集C2 = 1,其中ROWID在 (从表中选择 * (强制转换 (:B1为
FILAS)
计划哈希值: 4255393934
-
| Id | 操作 | 名称 | E行 | OMem | 1Mem | 二手-Mem |
-
| 0 | 更新语句 |
计划 _ 表 _ 输出
--
| 1 | 更新 | 兰扎 |
| * 2 | 哈希连接半 | | 1 | 650M | 32M | 752M (0)|
| 3 | 表访问完全 | LANZA | 1 |
| 4 | 集合迭代器PICKLER FETCH | | 999 |
-
谓词信息 (由操作id标识):
---------------------------------------------------
2-访问 (ROWID = CHARTOROWID (值 (KOKBF $)
计划 _ 表 _ 输出
----
-警告: 基本计划统计信息不可用。这些仅在以下情况下收集:
* 提示 “gather_plan_statistics” 用于语句或
* 参数 “statistic_level” 设置为 “全部”,在会话或系统级别
为了避免全面扫描,我应该如何做?
问候。
专家解答
与其尝试构建自己的并行解决方案,不如看看dbms_parallel_execute。
这是在11.2。您可以使用它通过rowid,数字列或SQL查询将表拆分为块。
您可以在以下位置找到出色的工作示例:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4248554900346593542
https://oracle-base.com/articles/11g/dbms_parallel_execute_11gR2
这是在11.2。您可以使用它通过rowid,数字列或SQL查询将表拆分为块。
您可以在以下位置找到出色的工作示例:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4248554900346593542
https://oracle-base.com/articles/11g/dbms_parallel_execute_11gR2
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




