由于 UNION 导致的视图和表列大小不匹配
Posted
技术标签:
【中文标题】由于 UNION 导致的视图和表列大小不匹配【英文标题】:View and Table Column Size mismatch due to UNION 【发布时间】:2020-04-13 11:28:59 【问题描述】:我使用联合 CVAS 创建了视图:
CREATE
OR REPLACE VIEW SAMPLEVIEW AS
SELECT
PT.CREDITPARTYACCOUNT AS PT_CREDITPARTYACCOUNT,
PT.DEBITPARTYACCOUNT AS PT_DEBITPARTYACCOUNT,
...
...
FROM
accountingevent AE
LEFT OUTER JOIN paymenttransaction PT ON (
AE.PAYMENTTRANSACTIONKEY = PT.PAYMENTTRANSACTIONKEY
)
OR (
AE.PAYMENTINSTRUCTIONKEY = PT.INCOMINGINSTRUCTIONKEY
)
WHERE
...
UNION ALL
SELECT
PT.CREDITPARTYACCOUNT AS PT_CREDITPARTYACCOUNT,
PT.DEBITPARTYACCOUNT AS PT_DEBITPARTYACCOUNT,
...
...
FROM
accountingevent AE
LEFT OUTER JOIN paymenttransaction PT ON (
AE.PAYMENTTRANSACTIONKEY = PT.PAYMENTTRANSACTIONKEY
)
WHERE
...
ORDER BY 1;
结果
DESC SAMPLEVIEW;
PT_CREDITPARTYACCOUNT VARCHAR2(1024 CHAR)
PT_DEBITPARTYACCOUNT VARCHAR2(1024 CHAR)
...
...
与
DESC PAYMENTTRANSACTION;
CREDITPARTYACCOUNT VARCHAR2(256 CHAR)
DEBITPARTYACCOUNT VARCHAR2(256 CHAR)
...
我得到的数据大小是表格列大小的 4 倍。 如果我们删除 UNION ALL 并使用单个 CVAS,则表格和视图中的大小将相等。 此视图和表格是大型脚本的一部分,因此脚本中的某些内容已关闭,从而导致了此行为。 这种奇怪的行为只在 char 和 varchar2 数据类型中可见。 我还检查了以下查询的结果:
select * from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';
NLS_CHARACTERSET AL32UTF8
请指导我了解导致此行为的问题所在。
谢谢
【问题讨论】:
这是个问题吗? 是的,视图列大小不应该等于表列大小吗? 我的意思是,这个报告的大小差异是否会导致实际问题?视图不占用任何实际空间,它们只是存储选择语句。我不知道甲骨文为什么给出这个大小,但它不会造成任何我能想象的伤害。 实际上有一个消费者系统需要为每一列分配大小。他们期望看到的表格大小。 好的,有道理 【参考方案1】:您正在测试哪个版本?这是我在数据库 (20.2) 上得到的:
SQL> desc tukc
Name Null? Type
----------- ----- ------------------
OBJECT_NAME VARCHAR2(128 CHAR)
OBJECT_ID NUMBER
SQL>
SQL> create or replace view tv as
2 select t.object_name
3 from tukc t join all_objects o on (t.object_id=o.object_id)
4 union all
5 select t.object_name
6 from tukc t join all_objects o on (t.object_id=o.object_id)
7 ;
View TV created.
SQL> desc tv
Name Null? Type
----------- ----- ------------------
OBJECT_NAME VARCHAR2(128 CHAR)
【讨论】:
我使用的是 Oracle 12.2.0.1.0 您的视图只有 2 个部分(即只有一个并集)?以上是关于由于 UNION 导致的视图和表列大小不匹配的主要内容,如果未能解决你的问题,请参考以下文章
如何解决由于 PyTorch 中大小不匹配导致的运行时错误?
Hibernate - OneToMany 注释导致选择查询的左连接不匹配
是啥导致 Container View 保持其子视图的框架与其边界匹配?