【问题标题】:View and Table Column Size mismatch due to UNION由于 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

请指导我了解导致此行为的问题所在。

谢谢

【问题讨论】:

  • 这是个问题吗?
  • 是的,视图列大小不应该等于表列大小吗?
  • 我的意思是,这个报告的大小差异是否会导致实际问题?视图不占用任何实际空间,它们只是存储选择语句。我不知道甲骨文为什么给出这个大小,但它不会造成任何我能想象的伤害。
  • 实际上有一个消费者系统需要为每一列分配大小。他们期望看到的表格大小。
  • 好的,有道理

标签: oracle view char union-all varchar2


【解决方案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 个部分(即只有一个并集)?
猜你喜欢
  • 2018-02-24
  • 2011-07-16
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多