Trafodion作为一款SQL on Hadoop的数据库引擎,支持标准的SQL功能,支持增删查改DML语句,也支持建表、建索引、建视图等DDL语句。本文主要介绍如何在Trafodion中创建视图,并查询视图的定义。
可能大家都已经了解什么是视图,但这里我还是要稍微提一下数据库中视图的概念。视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。
当然,这里我们讨论的视图是数据库中的普通视图,在某些关系型数据库如Oracle中,提供了另外一种视图–即物化视图。物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。物化视图可以基于表查询,视图和其它的物化视图。通常情况下,在复制环境下,物化视图被称为主表,在数据仓库中称为明细表。
因此,从上面的介绍中我们知道,普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
现在继续回到Trafodion的视图中来,由于目前Trafodion尚没有物化视图的概念,因此后面我们讨论的Trafodion视图都属于普通视图,即不存储任何数据,只有元数据信息。实际上,在Trafodion中,任何对象都有对应的元数据信息,元数据信息存储在单独的Schema “MD“中,通过get tables我们可以看到有哪些元数据表。
>>get tables in schema trafodion."_MD_";
Tables in Schema TRAFODION._MD_
===============================
AUTHS
COLUMNS
DEFAULTS
INDEXES
KEYS
LIBRARIES
LIBRARIES_USAGE
OBJECTS
REF_CONSTRAINTS
ROUTINES
SEQ_GEN
TABLES
TABLE_CONSTRAINTS
TEXT
UNIQUE_REF_CONSTR_USAGE
VERSIONS
VIEWS
VIEWS_USAGE
如果想从元数据信息中查看视图的定义,这涉及到上面列表中的三张表,VIEWS、OBJECTS和TEXT。第一个视图有一个唯一的标识VIEW_ID存储在VIEWS中,每个VIEW_ID对应OBJECTS表中的OBJECT_ID,每个OBJECT_ID在TEXT中对应一个TEXT_ID。另外,OBJECTS表中包含OBJECT_NAME字段,可以通过OBJECT_NAME字段查找特定名称的VIEW_ID,通过VIEW_ID,可以在TEXT表中查看到对应视图的视图定义。因而,我们可以使用以下语句来查看某一个视图名称对应的视图定义,
SQL>select a.* from "_MD_".text a, "_MD_".views b,"_MD_".objects c where a.text_uid = b.view_uid and b.view_uid = c.object_uid and c.object_name = 'TEST2_V' and c.schema_name = 'SEABASE';
TEXT_UID TEXT_TYPE SUB_ID SEQ_NUM FLAGS TEXT
-------------------- ----------- ----------- ----------- -------------------- --------------------------------------------------------------------------------------------------------------------------------
4574677199916640811 0 0 0 0 CREATE VIEW TRAFODION.SEABASE.TEST2_V AS SELECT TRAFODION.SEABASE.TEST2.A FROM TRAFODION.SEABASE.TEST2
4574677199916640811 8 0 0 0 viewUID: 4574677199916640811 viewCol: 0 refUID: 4606766110394796238 refCol: 1 refType: 1;
--- 2 row(s) selected.
另外,Trafodion提供两个命令可以查询视图的定义,即SHOWDDL和INVOKE,让我们通过下面例子查看视图的定义吧,
QL>showddl seabase.test2_v;
CREATE VIEW TRAFODION.SEABASE.TEST2_V AS
SELECT TRAFODION.SEABASE.TEST2.A FROM TRAFODION.SEABASE.TEST2 ;
--- SQL operation complete.
SQL>invoke seabase.test2_v;
-- Definition of Trafodion view TRAFODION.SEABASE.TEST2_V
-- Definition current Wed Dec 13 10:39:49 2017
(
A VARCHAR(10) CHARACTER SET ISO88591 COLLATE
DEFAULT DEFAULT NULL SERIALIZED
)
--- SQL operation complete.