由于 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,则表格和视图中的大小将相等。 此视图和表格是大型脚本的一部分,因此脚本中的某些内容已关闭,从而导致了此行为。 这种奇怪的行为只在 charvarchar2 数据类型中可见。 我还检查了以下查询的结果:

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 保持其子视图的框架与其边界匹配?

LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误

spring boot 2.0.0由于版本不匹配导致的NoSuchMethodError问题解析