hypopg, PostgreSQL的假设索引

分享于 

4分钟阅读

GitHub

  繁體 雙語
Hypothetical Indexes support for PostgreSQL
  • 源代码名称:hypopg
  • 源代码网址:http://www.github.com/HypoPG/hypopg
  • hypopg源代码文档
  • hypopg源代码下载
  • Git URL:
    git://www.github.com/HypoPG/hypopg.git
    Git Clone代码到本地:
    git clone http://www.github.com/HypoPG/hypopg
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/HypoPG/hypopg
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    HypoPG

    HypoPG是一个PostgreSQL扩展,增加了对假设索引的支持。

    一个假设或者虚拟索引是一个不存在的索引,因这里不需要 CPU。磁盘或者任何资源。 如果你能知道PostgreSQL是否会使用这些索引来创建它们,那么它们对于了解特定索引是否能提高有问题的查询的性能非常有用。 有关这里扩展用法的更多信息,你可以看到这个博客帖子。

    安装

    • 兼容 PostgreSQL 9.2和更高版本
    • 需要PostgreSQL头文件
    • 解压缩归档文件
    • make install
    • 在每个需要的数据库中:创建扩展 hypopg ;

    用法

    注:假设索引包含在单个后端中。 Therefeore,如果你添加了多个假设索引,并发connexions将不会受到你想象的索引的干扰。

    假设一个简单的测试用例:

    
    rjuju=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;
    
    
    rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
    
    
     QUERY PLAN
    
    
    -------------------------------------------------------
    
    
     Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
    
    
     Filter: (id = 1)
    
    
    (2 rows)
    
    
    
    

    创建假设索引的最简单方法是使用 hypopg_create_index 函数和常规创建索引语句作为 arg。

    举个例子:

    
    rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');
    
    
    
    

    注意:创建索引语句的一些信息将被忽略,如提供的索引 NAME。 一些被忽略的信息将在将来的版本中被处理。

    你可以在你自己的后端中检查可用的假设索引:

    
    rjuju=# SELECT * FROM hypopg_list_indexes();
    
    
     indexrelid | indexname | nspname | relname | amname
    
    
     -----------+-------------------------------------------+---------+---------+--------
    
    
     205101 | <41072>btree_hypo_id | public | hypo | btree
    
    
    
    

    如果需要关于假设索引的更多技术信息,hypopg() 函数将以类似pg_index系统目录的方式返回假设的索引。

    现在,让我们看看你以前的解释语句是否会使用这样的索引:

    
    rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
    
    
     QUERY PLAN
    
    
    ------------------------------------------------------------------------------------
    
    
     Index Scan using <41072>hypo_btree_hypo_id on hypo (cost=0.29..8.30 rows=1 width=13)
    
    
     Index Cond: (id = 1)
    
    
    (2 rows)
    
    
    
    

    当然,仅解释不进行分析将使用假设索引:

    
    rjuju=# EXPLAIN ANALYZE SELECT * FROM hypo WHERE id = 1;
    
    
     QUERY PLAN
    
    
    -------------------------------------------------------------------------------------------------
    
    
     Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13) (actual time=0.036..6.072 rows=1 loops=1)
    
    
     Filter: (id = 1)
    
    
     Rows Removed by Filter: 9999
    
    
     Planning time: 0.109 ms
    
    
     Execution time: 6.113 ms
    
    
    (5 rows)
    
    
    
    

    如果你想删除后台索引,你可以使用英镑 hypopg_drop_index(indexrelid) 函数,以英镑函数返回 call hypopg_reset() remove remove或者关闭你当前连接。


    pos  POST  postgres  index  Postgresql  indexes