科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道解析:通过创建物化视图来提高查询速度

解析:通过创建物化视图来提高查询速度

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

有了物化视图,那些过去需要数小时运行的报告可以在几分钟内完成。物化视图可以包括联接(join)和集合(aggregate),它提供了一种储存预计算结果的方法。

作者:赛迪网 yuanyang 来源:天新网 2008年3月26日

关键字: 数据库 Mssql SQL SQL Server

  • 评论
  • 分享微博
  • 分享邮件

Joinback

Joinback技术非常有用,因为它允许当物化视图中没有列时进行查询改写。清单 3中的查询要求按月和按产品类别的销售总额,而该物化视图中并没有product.category列。然而,产品表的主键product_id列则位于物化视图中。因此,优化器可以将物化视图与产品表联接起来以得到产品类别。

代码清单 3:通过joinback获得销售总额

 
  SELECT t.month, p.category, 
    SUM(ps.purchase_price) as sum_of_sales
  
  FROM time t, product p, purchases ps
  WHERE t.time_key = ps.time_key AND
  ps.product_id = p.product_id
  
  GROUP BY t.month, p.category;
  
  Id  Operation           Name
  __________________________________________________
  
  0  SELECT STATEMENT
  1   SORT GROUP BY
  2   HASH JOIN
  3    TABLE Access FULL      PRODUCT
  
  4    MAT_VIEW REWRITE ACCESS FULL MONTHLY_SALES_MV

使用维度进行查询改写

在一个使用维度建模技巧设计的典型数据仓库中,数据中存在着著名的“层次关系”。例如,在时间层次中,“天”积累成“月”,“月”又积累成“年”。在Oracle数据库中,可以使用CREATE DIMENSION语句创建一个叫做“DIEMNSION”的对象,向优化器声明这种关系。维度对象是一个描述性对象,除了其元数据外,它不占用空间。使用DIMENSION对象声明的关系据说是可信的。Oracle不会验证这一关系对于你的数据是否一定成立,它只是假设数据库管理员已经判定这些关系是正确的。可信信息的其他示例是使用NOVALIDATE RELY标记的约束及注册为物化视图的先存表。

对于采用可信信息(包括维度)的查询改写,初始化参数QUERY_ REWRITE_INTEGRITY必须被设置为TRUSTED,如下所示:

ALTER SESSION SET query_rewrite_integrity = TRUSTED;

例如,假设有一个时间维度,其声明如下:

 
  CREATE DIMENSION time_dim
  LEVEL time_key IS time.time_key
  LEVEL month IS time.month
  LEVEL quarter IS time.quarter
  LEVEL year IS time.year
  HIERARCHY calendar_rollup (
  time_key CHILD OF
  month  CHILD OF
  quarter CHILD OF
  year
  )
  
  ATTRIBUTE time_key determines (day_of_week, holiday)
  ATTRIBUTE month  determines (month_name);

现在,如果具有清单 4中要求按年的销售额的查询,你仍然可以使用monthly_sales_mv物化视图,因为维度对象中的HIERARCHY子句告诉Oracle数据库月销售额可以积累成年销售额。它利用前面描述的joinback技巧由物化视图中的“月”列得到“年”列的值。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章