创建和变更具体化查询表

具体化查询表 是一个表,其定义基于查询结果,其数据采用从具体化查询表定义所基于的一个或多个表中获取的预计算结果形式。

如果优化器确定针对具体化查询表的查询运行速度比针对基本表的查询运行速度更快,那么该查询将针对具体化查询表运行。 您可以直接查询具体化查询表。 有关优化器如何使用具体化查询表的更多信息,请参阅 数据库性能和查询优化 主题。

假定名为 TRANS 的超大交易表针对公司处理的每个交易都包含一行。 该表由许多列定义。 通过发出以下命令,为 TRANS 表创建具体化查询表,其中包含交易日期和金额的每日摘要数据:

CREATE TABLE STRANS
  AS (SELECT YEAR AS SYEAR, MONTH AS SMONTH, DAY AS SDAY, SUM(AMOUNT) AS SSUM
      FROM TRANS 
      GROUP BY YEAR, MONTH, DAY )
  DATA INITIALLY DEFERRED
  REFRESH DEFERRED
  MAINTAINED BY USER;

此具体化查询表指定在使用 DATA 初始 DEFERRED 子句创建表时未填充该表。 REFRESH DEFERRED 指示对 TRANS 所作的更改未反映在 STRANS 中。 此外,此表由用户维护,使用户能够使用 ALTER , INSERT , DELETE 和 UPDATE 语句。

要填充具体化查询表或在填充表后刷新表,请使用 REFRESH TABLE 语句。 这将导致运行与具体化查询表相关联的查询,并使该表中填充查询结果。 要填充 STRANS 表,请运行以下语句:

REFRESH TABLE STRANS;

只要 SELECT 语句的结果提供与现有表中的列匹配的一组列 (相同的列数和兼容的列定义) ,就可以从现有基本表创建具体化查询表。 例如,创建表 TRANSCOUNT。 然后,将基本表 TRANSCOUNT 更改为具体化查询表:

要创建表:

CREATE TABLE TRANSCOUNT
    (ACCTID SMALLINT NOT NULL,
     LOCID SMALLINT,
     YEAR DATE
     CNT INTEGER);

您可以将此表变更为具体化查询表:

ALTER TABLE TRANSCOUNT
  ADD MATERIALIZED QUERY
      (SELECT  ACCTID, LOCID, YEAR, COUNT(*) AS CNT
      FROM TRANS 
      GROUP BY ACCTID, LOCID, YEAR )
  DATA INITIALLY DEFERRED
  REFRESH DEFERRED
  MAINTAINED BY USER;

最后,可以将具体化查询表更改回基本表。 例如:

ALTER TABLE TRANSCOUNT
      DROP MATERIALIZED QUERY;

在此示例中,未删除表 TRANSCOUNT ,但它不再是具体化查询表。