zoukankan      html  css  js  c++  java
  • Parameterized Path 的例子

    Improve the planner's ability to use nested loops with inner index scans (Tom Lane)
    
    The new "parameterized path" mechanism allows inner index scans to use values from relations that are more than one join level up from the scan. This can greatly improve performance in situations where semantic restrictions (such as outer joins) limit the allowed join orderings.

    http://www.postgresql.org/docs/current/static/release-9-2.html

    数据准备:

    postgres=# create table tst01(id integer);
    CREATE TABLE
    postgres=# 
    
    postgres=# insert into tst01 values(generate_series(1,100000));
    INSERT 0 100000
    postgres=# 
    
    postgres=# create index idx_tst01_id on tst01(id);
    CREATE INDEX
    postgres=# 

    运行:

    postgres=# prepare s(int) as select * from tst01 t where id < $1;
    PREPARE
    postgres=# explain execute s(2);
                                       QUERY PLAN                                    
    ---------------------------------------------------------------------------------
     Index Only Scan using idx_tst01_id on tst01 t  (cost=0.00..8.38 rows=1 width=4)
       Index Cond: (id < 2)
    (2 rows)
    
    postgres=# explain execute s(10000);
                                          QUERY PLAN                                       
    ---------------------------------------------------------------------------------------
     Index Only Scan using idx_tst01_id on tst01 t  (cost=0.00..337.64 rows=10130 width=4)
       Index Cond: (id < 10000)
    (2 rows)
    
    postgres=# explain execute s(1000000);
                              QUERY PLAN                           
    ---------------------------------------------------------------
     Seq Scan on tst01 t  (cost=0.00..1693.00 rows=100000 width=4)
       Filter: (id < 1000000)
    (2 rows)
    
    postgres=# explain execute s(100000);
                              QUERY PLAN                           
    ---------------------------------------------------------------
     Seq Scan on tst01 t  (cost=0.00..1693.00 rows=100000 width=4)
       Filter: (id < 100000)
    (2 rows)
    
    postgres=# 

    这是一个小例子,而且还是一个有些特殊的例子。

    对比一下在PostgreSQL9.1.0中的表现:

    postgres=# create table tst01(id integer);
    CREATE TABLE
    postgres=# insert into tst01 values(generate_series(1,100000));
    INSERT 0 100000
    postgres=# create index idx_tst01_id on tst01(id);
    CREATE INDEX
    postgres=# prepare s(int) as select * from tst01 t where id < $1;
    PREPARE
    postgres=# explain execute s(2);
                                       QUERY PLAN                                   
     
    --------------------------------------------------------------------------------
    -
     Bitmap Heap Scan on tst01 t  (cost=626.59..1486.25 rows=33333 width=4)
       Recheck Cond: (id < $1)
       ->  Bitmap Index Scan on idx_tst01_id  (cost=0.00..618.26 rows=33333 width=0)
             Index Cond: (id < $1)
    (4 rows)
    
    postgres=# explain execute s(10000);
                                       QUERY PLAN                                   
     
    --------------------------------------------------------------------------------
    -
     Bitmap Heap Scan on tst01 t  (cost=626.59..1486.25 rows=33333 width=4)
       Recheck Cond: (id < $1)
       ->  Bitmap Index Scan on idx_tst01_id  (cost=0.00..618.26 rows=33333 width=0)
             Index Cond: (id < $1)
    (4 rows)
    
    postgres=# 

    可以看到,在9.1里,是不区分状况,执行计划固定。

  • 相关阅读:
    QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
    hdu 5312 Sequence(数学推导——三角形数)
    Windows 操作系统与 .NET Framework
    Cocos2d-x手机游戏开发与项目实践具体解释_随书代码
    Uva 10081 Tight words (概率DP)
    从零使用qemu模拟器搭建arm执行环境
    hdu 2255 奔小康赚大钱(KM算法)
    最大子序列和问题
    深入理解javascript之高级定时器
    openstack 镜像自动扩容 resize拉伸
  • 原文地址:https://www.cnblogs.com/gaojian/p/3140795.html
Copyright © 2011-2022 走看看