`
jianchen
  • 浏览: 343107 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

query rewrite的理解

阅读更多
我的理解
query rewrite 和 biee中的聚合表功能很像。只不过oracle中用material view来达到目的,在数据库层面实现,发出来的sql一样,从执行计划才能看出来是否走了material view。而biee是在逻辑层进行了自动切换,走相应的聚合表,发出的sql已经表明了要走的聚合表。
 

 

Query Rewrite 在数据仓库是是一个非常有用的技术, Tom在<<Effective Oracle by Design>>一书中将实体化视图(MView)称为是数据仓库的索引, 这是再贴切不过的了, 在OLTP中当SELECT语句的所有的字段都在索引中时, Oracle可以不从表读数据, 而直接从索引中获得全部信息, 而Query Rewrite则是通过创建中间表, 让Oracle自动从创建的中间表读取数据, 而不需要从原表读取了, 这个中间表可以是预先join好的或预先计算好的中间结果. 他的使用就和一般的索引同理了, 虽然你指定的还是那个大表, 但oracle可以为你自动识别可以从那个"数据仓库索引"中读取数据. 下面我们可以来看一下最简单的例子:

SQL> CREATE TABLE DETAIL_TABLE                                     
  2  AS SELECT OWNER,OBJECT_NAME FROM sys.dba_objects; 

Table created.

SQL> DESC DETAIL_TABLE
 Name                               Null?    Type 
 ———————————- ——– ————–
 OWNER                                       VARCHAR2(30)
 OBJECT_NAME                                 VARCHAR2(128)

SQL> CREATE MATERIALIZED VIEW MID_TABLE ENABLE QUERY REWRITE
  2  AS
  3  SELECT OWNER,COUNT(*) TABCNT FROM DETAIL_TABLE GROUP BY OWNER;

Materialized view created.

SQL> DESC MID_TABLE
 Name                              Null?    Type
 ——————————— ——– ————–
 OWNER                                      VARCHAR2(30)
 TABCNT                                     NUMBER

 

   现在假设DETAIL_TABLE是一个非常大的表, MID_TABLE是预先计算好的中间表, 我们来做一个查询测试一下, 要让Oracle使用Query Rewrite,首先要使用CBO,我已经对这个两个表作了分析, 然后将query_rewrite_enabled参数设为True,这个参数可以在session一级更改. 如:

SQL> show parameter query_rewrite_enabled

NAME                                 TYPE        VALUE
———————————— ———– ———
query_rewrite_enabled                string      FALSE

SQL> SELECT  OWNER,COUNT(*) FROM DETAIL_TABLE
  2   WHERE OWNER=’SYSTEM’ GROUP BY OWNER;

OWNER                            COUNT(*)
—————————— ———-
SYSTEM                                406

Execution Plan
———————————————————-
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 …)
   1    0   SORT (GROUP BY NOSORT) (Cost=4 …)
   2    1     TABLE ACCESS (FULL) OF ‘DETAIL_TABLE’ (Cost=4 …

SQL> ALTER SESSION SET query_rewrite_enabled=TRUE;

Session altered.

SQL> SELECT  OWNER,COUNT(*) FROM DETAIL_TABLE
  2  WHERE OWNER=’SYSTEM’ GROUP BY OWNER;

OWNER                            COUNT(*)
—————————— ———-
SYSTEM                                406

Execution Plan
———————————————————-
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF ‘MID_TABLE’ (Cost=2 Card=1 Bytes=8)

    大家可以看一下上面两个同样的语句在query rewrite时启用和禁用时的plan的区别, 可以看到MID_TABLE的作用就象是一个索引. 除了Query_rewrite_enabled参数外, 还有一个参数query_rewrite_integrity会影响Query Rewrite的使用.

分享到:
评论

相关推荐

    Apache Rewrite Module 的重定向问题

    通过上述介绍,我们可以看到Apache Rewrite Module提供了非常灵活且强大的URL重写功能,但同时也需要开发者具备一定的正则表达式基础以及对HTTP协议的理解。合理利用这些特性能够极大地提升网站的可用性和可维护性。

    Rewrite程序端

    Rewrite程序端主要指的是在Web服务器中用于URL重写的技术,它是Apache HTTP Server中的一个模块,通常称为mod_rewrite。...然而,正确使用和配置Rewrite规则需要对正则表达式和Apache配置有深入理解。

    UrlRewrite实现伪静态

    提供的`UrlRewriteDemo`可能包含了演示如何使用UrlRewrite实现伪静态的示例代码和配置文件,可以帮助你更好地理解并实践上述概念。 通过UrlRewrite组件,我们可以轻松地实现URL重写和伪静态,从而提升网站的用户...

    urlrewrite 完整实例,可直接运行。支持多个参数传递

    `URLRewrite` 是一款非常实用的开源工具,主要用于处理和重写Web应用程序中的URL,以实现更加友好、简洁...通过对`urlrewrite.xml`配置文件的学习和实践,可以深入理解其工作原理,从而在实际项目中发挥更大的作用。

    nginx之rewrite

    学习rewrite规则需要对正则表达式有深刻的理解,同时熟悉nginx的配置结构和各个指令的作用。通过结合理论和实战,可以在理解的基础上逐渐掌握复杂的rewrite规则。 十二、参考文献 文档建议参阅相关资料,进一步学习...

    用urlrewrite实现实现伪静态的例子

    3. **在C#代码中配合使用**:在ASP.NET的后端代码中,你可能需要根据新的URL格式进行一些调整,比如在获取新闻ID时,不再是从Query String中获取,而是从路由数据中获取。 4. **测试与优化**:完成配置后,你需要对...

    urlrewrite伪静态 及多参数传递-附正则表达式语法

    在压缩包中的“正则表达式.txt”文件,可能包含了更多关于正则表达式的详细说明和示例,对于深入理解和使用urlrewrite工具至关重要。学习和掌握正则表达式,能让你更好地利用urlrewrite实现高效、灵活的URL管理。

    mod_rewrite-cheat-sheet-v2.pdf

    ### mod_rewrite-cheat-sheet-v2.pdf 知识点解析 ...以上内容全面覆盖了 `mod_rewrite-cheat-sheet-v2.pdf` 中的核心知识点及其应用实例,希望能帮助读者更好地理解和掌握 `mod_rewrite` 的使用技巧。

    从PHP $_SERVER相关参数判断是否支持Rewrite模块

    Rewrite模块通常用于Apache服务器,允许我们通过重写URL规则来处理请求,使得URL更易于理解和管理。在Apache环境中,Rewrite模块会生成特定的`$_SERVER`数组变量,如`REDIRECT_QUERY_STRING`和`REDIRECT_URL`,这些...

    Oracle物化视图应用详解

    - `ENABLE QUERY REWRITE` 或 `DISABLE QUERY REWRITE` 控制是否启用查询重写功能。 - `REFRESH` 选项定义了刷新策略,如 `FORCE` 在每次查询时强制刷新,`FAST` 利用物化视图日志进行快速刷新,`COMPLETE` 是完全...

    贝壳找房数据库服务综合治理之路.pdf

    当出现慢查询时,系统会主动防御,比如kill长时间运行的事务,设定`max_execution_time`限制来防止超时请求,以及使用Query Rewrite技术重写可能导致性能瓶颈的SQL语句。Query Rewrite支持单值匹配,但需注意长度...

    lucene-搜索过程源码解析-1-Weight生成.txt

    public Query rewrite(Query original) throws IOException { for (Query rewrittenQuery = original.rewrite(reader); rewrittenQuery != original; rewrittenQuery = rewrittenQuery.rewrite(reader)) { ...

    关于Apache_mod_rewite的中文配置和RewriteRule规则详细介绍

    - `QSA`:Query String Append,保留原始URL中的查询字符串。 四、流程控制与条件判断 除了RewriteRule外,mod_rewrite还提供了RewriteCond指令用于设置条件判断。RewriteCond允许根据不同的条件执行不同的...

    OCM考试实验笔记之一_物化视图.pdf

    2. 物化视图的查询重写(QUERY REWRITE)功能允许Oracle自动将对物化视图的查询转换为对物化视图本身的访问,从而提高查询性能。例如,上述创建的物化视图`mv1`,在查询时可以被重写,从而直接访问物化视图,而不...

    Apache伪静态时rewrite匹配参数超过10个的处理方法.docx

    首先,理解`RewriteRule`和`RewriteCond`的反向引用是非常关键的。在`RewriteRule`中,我们可以通过`$N`来引用上一个正则表达式匹配的子组(括号内的部分),`N`的范围是0到9,其中`$0`代表整个匹配的字符串。而在`...

    Oracle BI11 g Video

    7. **性能优化**:Oracle BI11g包含了性能优化工具,如Query Rewrite和Smart View,可以提高查询速度,减少对数据库的压力。 8. **安全性**:系统提供角色基础的权限管理,确保敏感数据的安全,只允许授权用户访问...

    12-3+旅行场景下搜索技术应用与创新.pdf

    在面对航旅召回的挑战时,如商品数量有限、用户行为稀疏、query与商品描述间的差异等问题,猪搜采用了Learning To Rewrite等技术,通过多路改写生成候选集合,并使用word2vec、doc2vec和DSSM等模型进行学习和排名,...

    时间都去哪儿了 - 深入学习SQL查询优化

    4. 查询重写(Query Rewrite):将查询重写为在语义上等价的另一个查询,以提高查询效率。 PlanCache PlanCache 是 SQL 查询优化中的一个重要组件。PlanCache 的主要作用是缓存执行计划,以避免执行计划生成的时间...

Global site tag (gtag.js) - Google Analytics