zoukankan      html  css  js  c++  java
  • postgresql在何时创建表和索引文件

    oracle中有个特性:deferred segment createion。那么在postgresql中,在创建表或者索引的时候,磁盘上对应的文件是立即创建还是插入第一行数据的时候创建呢?

    来做个简单的测试。

    postgres=# create table t1(a int);
    CREATE TABLE
    postgres=# select pg_relation_filepath('t1');
     pg_relation_filepath 
    ----------------------
     base/13878/75000
    (1 row)
    
    postgres=# ! oid2name -d postgres -t t1
    From database "postgres":
      Filenode  Table Name
    ----------------------
         75000          t1
    postgres=# 
    

     

    现在我们看看文件是否已经被创建

    $ ls -la $PGDATA/base/13878/75000
    -rw------- 1 postgres postgres 0 Oct 31 19:18 /pg/11/data/base/13878/75000
    

    文件已经被创建,但是是空文件。

    但是还没有创建visibility map和free space map文件:

    $ ls -la $PGDATA/base/13878/75000*
    -rw------- 1 postgres postgres 0 Oct 31 19:18 /pg/11/data/base/13878/75000
    

      


    如果我们在这个空表上创建一个索引会发生什么呢?

    postgres=# create index i1 on t1 (a);
    CREATE INDEX
    postgres=# select pg_relation_filepath('i1');
     pg_relation_filepath 
    ----------------------
     base/13878/75003
    (1 row)
    
    postgres=# ! ls -la $PGDATA/base/13878/75003
    -rw------- 1 postgres postgres 8192 Oct 31 19:27 /pg/11/data/base/13878/75003
    

    索引文件立即被创建了,但是不是一个空文件。恰好是一个page的大小。使用pageinspect我们可以确定这个页只是存放了元数据。

    postgres=# create extension pageinspect;
    CREATE EXTENSION
    postgres=# SELECT * FROM bt_metap('i1');
     magic  | version | root | level | fastroot | fastlevel | oldest_xact | last_cleanup_num_tuples 
    --------+---------+------+-------+----------+-----------+-------------+-------------------------
     340322 |       3 |    0 |     0 |        0 |         0 |           0 |                      -1
    (1 row)
    
    postgres=# SELECT * FROM bt_page_stats('i1', 0);
    ERROR:  block 0 is a meta page
    postgres=# 
    

      

    到此为止,还有一个问题,free space map和visibility map文件是什么时候创建的呢?是在第一个插入之后?

    postgres=# insert into t1 (a) values (1);
    INSERT 0 1
    postgres=# ! ls -la $PGDATA/base/13878/75000*
    -rw------- 1 postgres postgres 8192 Oct 31 19:33 /pg/11/data/base/13878/75000
    postgres=# 
    

      

    显然不是。正确的答案是在vacuum之后。

    postgres=# vacuum t1;
    VACUUM
    postgres=# ! ls -la $PGDATA/base/13878/75000*
    -rw------- 1 postgres postgres  8192 Oct 31 19:33 /pg/11/data/base/13878/75000
    -rw------- 1 postgres postgres 24576 Oct 31 19:34 /pg/11/data/base/13878/75000_fsm
    -rw------- 1 postgres postgres  8192 Oct 31 19:34 /pg/11/data/base/13878/75000_vm
    postgres=# 
    

      

     

  • 相关阅读:
    contentEditable
    Web开发工具(插件)收集
    用limit 传变量TO 存储过程解决方案(续)
    ASP.NET1.1和ASP.NET2.0中数据库连接字符串的不同设置
    按比例微缩图片的一段小小的JS代码
    研究下市场上有哪些软件项目/产品,哪些是值得做的?
    Ajax联动下拉框的实现例子
    C#装箱与拆箱
    在VS2005连接SQL2005时不允许远程连接
    联系我们
  • 原文地址:https://www.cnblogs.com/abclife/p/13907265.html
Copyright © 2011-2022 走看看