Oracle 12c - 从视图中获取 IMPORT_TABLE_STATS
Posted
技术标签:
【中文标题】Oracle 12c - 从视图中获取 IMPORT_TABLE_STATS【英文标题】:Oracle 12c - getting IMPORT_TABLE_STATS from view 【发布时间】:2018-05-15 12:22:52 【问题描述】:我有一些代码在 Oracle 11g 上运行,我们正在迁移到 12c (12.2.0.1.0)。
在其中一个处理过程中调用DBMS_STATS.IMPORT_TABLE_STATS
,并在stattab
中提供了视图的参数名称。
该视图是一个表的简单选择查询,一列由解码函数计算,其他列在源列中。调用IMPORT_TABLE_STATS
的用户是目标表、视图和视图下表的所有者。
在 11g 中代码正在运行,在 12c 中我收到以下错误:
ORA-20000: 对象不存在或权限不足。
关于理性的任何想法? 12c 版本的DBMS_STATS
实现是否有更改,禁止使用视图作为IMPORT_TABLE_STATS
的源?
【问题讨论】:
出于好奇,如果您将其作为 sysdba 运行,或者授予用户 ANALYZE ANY 权限,它会起作用吗? 在第一次阅读你的问题时,我的反应是:你入侵了DMBS_STATS
,发现IMPORT_TABLE_STATS
接受了一个视图而不是官方的CREATE_STAT_TABLE
表,现在很不高兴这个黑客没有不能在 12.2 中工作。话虽如此,我觉得这样的创造力令人印象深刻,当然值得研究一下。
【参考方案1】:
CREATE_STAT_TABLE
在 11.2 和 12.2 中创建的表是不同的。如果您想让IMPORT_TABLE_STATS
吞下它,您的视图至少应该看起来有点像官方表格。
Column 11.2 12.2
statid VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
type CHAR(1 CHAR) CHAR(1 BYTE)
version NUMBER NUMBER
flags NUMBER NUMBER
c1 VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
c2 VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
c3 VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
c4 VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
c5 VARCHAR2(30 CHAR) VARCHAR2(128 BYTE)
c6 - VARCHAR2(128 BYTE)
n1 NUMBER NUMBER
n2 NUMBER NUMBER
n3 NUMBER NUMBER
n4 NUMBER NUMBER
n5 NUMBER NUMBER
n6 NUMBER NUMBER
n7 NUMBER NUMBER
n8 NUMBER NUMBER
n9 NUMBER NUMBER
n10 NUMBER NUMBER
n11 NUMBER NUMBER
n12 NUMBER NUMBER
n13 - NUMBER
d1 DATE DATE
R1 RAW(32) RAW(1000)
R2 RAW(32) RAW(1000)
R3 - RAW(1000)
CH1 VARCHAR2(1000 CHAR) VARCHAR2(1000 BYTE)
CL1 CLOB CLOB
BL1 - BLOB
【讨论】:
以上是关于Oracle 12c - 从视图中获取 IMPORT_TABLE_STATS的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]