返回顶部
首页 > 资讯 > 数据库 >PostgreSQL数据页Page中的行数据分析
  • 353
分享到

PostgreSQL数据页Page中的行数据分析

2024-04-02 19:04:59 353人浏览 独家记忆
摘要

这篇文章主要介绍“postgresql数据页Page中的行数据分析”,在日常操作中,相信很多人在Postgresql数据页Page中的行数据分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,

这篇文章主要介绍“postgresql数据页Page中的行数据分析”,在日常操作中,相信很多人在Postgresql数据页Page中的行数据分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL数据页Page中的行数据分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、测试数据

详见上一节,数据文件中的内容如下:

[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801
00000000  01 00 00 00 88 20 2a 12  00 00 00 00 28 00 60 1f  |..... *.....(.`.|
00000010  00 20 04 20 00 00 00 00  d8 9f 4e 00 b0 9f 4e 00  |. . ......N...N.|
00000020  88 9f 4e 00 60 9f 4e 00  00 00 00 00 00 00 00 00  |..N.`.N.........|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001f60  e5 1b 18 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001f70  04 00 03 00 02 08 18 00  04 00 00 00 13 34 20 20  |.............4  |
00001f80  20 20 20 20 20 05 64 00  e4 1b 18 00 00 00 00 00  |    .d.........|
00001f90  00 00 00 00 00 00 00 00  03 00 03 00 02 08 18 00  |................|
00001fa0  03 00 00 00 13 33 20 20  20 20 20 20 20 05 63 00  |.....3      .c.|
00001fb0  e3 1b 18 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001fc0  02 00 03 00 02 08 18 00  02 00 00 00 13 32 20 20  |.............2  |
00001fd0  20 20 20 20 20 05 62 00  e2 1b 18 00 00 00 00 00  |    .b.........|
00001fe0  00 00 00 00 00 00 00 00  01 00 03 00 02 08 18 00  |................|
00001ff0  01 00 00 00 13 31 20 20  20 20 20 20 20 05 61 00  |.....1      .a.|
00002000
二、Items(Tuples)

每个Tuple包括两部分,第一部分是Tuple头部信息,第二部分是实际的数据。

1、HeapTupleHeader

相关数据结构如下:

//--------------------- src/include/storage/off.h

typedef uint16 OffsetNumber;

//--------------------- src/include/storage/block.h

typedef struct BlockIdData
{
    uint16      bi_hi;
    uint16      bi_lo;
} BlockIdData;

typedef BlockIdData *BlockId; 

//--------------------- src/include/storage/itemptr.h

 typedef struct ItemPointerData
 {
     BlockIdData ip_blkid;
     OffsetNumber ip_posid;
 }

//--------------------- src/include/access/htup_details.h
typedef struct HeapTupleFields
{
    TransactionId t_xmin;       
    TransactionId t_xmax;       
    uNIOn
    {
        CommandId   t_cid;      
        TransactionId t_xvac;   
    }           t_field3;
} HeapTupleFields;

typedef struct DatumTupleFields
{
    int32       datum_len_;     

    int32       datum_typmod;   

    Oid         datum_typeid;   

    
} DatumTupleFields;

struct HeapTupleHeaderData
{
    union
    {
        HeapTupleFields t_heap;
        DatumTupleFields t_datum;
    }           t_choice;

    ItemPointerData t_ctid;     

    

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2 2
    uint16      t_infomask2;    

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK 3
    uint16      t_infomask;     

#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF 4
    uint8       t_hoff;         

    

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS 5
    bits8       t_bits[FLEXIBLE_ARRAY_MEMBER];  

    
};

结构体展开,详见下表:

Field           Type            Length  Offset  Description
t_xmin          TransactionId   4 bytes 0       insert XID stamp
t_xmax          TransactionId   4 bytes 4       delete XID stamp
t_cid           CommandId       4 bytes 8       insert and/or delete CID stamp (overlays with t_xvac)
t_xvac          TransactionId   4 bytes 8       XID for VACUUM operation moving a row version
t_ctid          ItemPointerData 6 bytes 12      current TID of this or newer row version
t_infomask2     uint16          2 bytes 18      number of attributes, plus various flag bits
t_infomask      uint16          2 bytes 20      various flag bits
t_hoff          uint8           1 byte  22      offset to user data
//注意:t_cid和t_xvac为联合体,共用存储空间

从上一节我们已经得出第1个Tuple的偏移为8152,下面使用hexdump对其中的数据逐个解析:
t_xmin

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8152 -n 4
00001fd8  e2 1b 18 00                                       |....|
00001fdc
[xdb@localhost ~]$ echo $((0x00181be2))
1580002

t_xmax

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8156 -n 4
00001fdc  00 00 00 00                                       |....|
00001fe0

t_cid/t_xvac

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8160 -n 4
00001fe0  00 00 00 00                                       |....|
00001fe4

t_ctid

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8164 -n 6
00001fe4  00 00 00 00 01 00                                 |......|
00001fea

//ip_blkid=\x0000,即blockid=0
//ip_posid=\x0001,即posid=1,第1个tuple

t_infomask2

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8170 -n 2
00001fea  03 00                                             |..|
00001fec

//t_infomask2=\x0003,3代表什么意思?我们看看t_infomask2的说明
 

 #define HEAP_NATTS_MASK 0x07FF 

 

 #define HEAP_KEYS_UPDATED 0x2000 

 #define HEAP_HOT_UPDATED 0x4000 

 #define HEAP_ONLY_TUPLE 0x8000 

 #define HEAP2_XACT_MASK 0xE000 
//根把十六进制值转换为二进制显示
     11111111111 #define HEAP_NATTS_MASK         0x07FF 
  10000000000000 #define HEAP_KEYS_UPDATED       0x2000  
 100000000000000 #define HEAP_HOT_UPDATED        0x4000  
1000000000000000 #define HEAP_ONLY_TUPLE         0x8000  
1110000000000000 #define HEAP2_XACT_MASK         0xE000 
1111111111111110 #define SpecTokenOffsetNumber       0xfffe
//前(低)11位为属性的个数,3意味着有3个属性(字段)

t_infomask

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8172 -n 2
00001fec  02 08                                             |..|
00001fee
[xdb@localhost ~]$ echo $((0x0802))
2050
[xdb@localhost ~]$ echo "obase=2;2050"|bc
100000000010

//t_infomask=\x0802,十进制值为2050,二进制值为100000000010
//t_infomask说明
               1 #define HEAP_HASNULL            0x0001  
              10 #define HEAP_HASVARWIDTH        0x0002  
             100 #define HEAP_HASEXTERNAL        0x0004  
            1000 #define HEAP_HASOID             0x0008  
           10000 #define HEAP_XMAX_KEYSHR_LOCK   0x0010  
          100000 #define HEAP_COMBOCID           0x0020  
         1000000 #define HEAP_XMAX_EXCL_LOCK     0x0040  
        10000000 #define HEAP_XMAX_LOCK_ONLY     0x0080  
                    
                 #define HEAP_XMAX_SHR_LOCK  (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
                 #define HEAP_LOCK_MASK  (HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | \
                          HEAP_XMAX_KEYSHR_LOCK)
       100000000 #define HEAP_XMIN_COMMITTED     0x0100  
      1000000000 #define HEAP_XMIN_INVALID       0x0200  
                 #define HEAP_XMIN_FROZEN        (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)
     10000000000 #define HEAP_XMAX_COMMITTED     0x0400  
    100000000000 #define HEAP_XMAX_INVALID       0x0800  
   1000000000000 #define HEAP_XMAX_IS_MULTI      0x1000  
  10000000000000 #define HEAP_UPDATED            0x2000  
 100000000000000 #define HEAP_MOVED_OFF          0x4000  
1000000000000000 #define HEAP_MOVED_IN           0x8000  
                 #define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)
1111111111110000 #define HEAP_XACT_MASK          0xFFF0  
//\x0802,二进制100000000010表示第2位和第12位为1,
//意味着存在可变长属性(HEAP_HASVARWIDTH),XMAX无效(HEAP_XMAX_INVALID)

t_hoff

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8174 -n 1
00001fee  18                                                |.|
00001fef
[xdb@localhost ~]$ echo $((0x18))
24
//用户数据开始偏移为24,即8152+24

2、Tuple

说完了Tuple的头部数据,接下来我们看看实际的数据存储。上一节我们得到Tuple总的长度是39,计算得到数据大小为39-24=15。

[xdb@localhost ~]$ hexdump -C $PGDATA/base/16477/24801 -s 8176 -n 15
00001ff0  01 00 00 00 13 31 20 20  20 20 20 20 20 05 61     |.....1       .a|
00001fff

回顾我们的表结构:
create table t_page (id int,c1 char(8),c2 varchar(16));
第1个字段为int,第2个字段为定长字符,第3个字段为变长字符。
相应的数据:
id=\x00000001,数字1
c1=\x133120202020202020,字符串,无需高低位变换,第1个字节\x13为标志位,后面是字符'1'+7个空格
c2=\x0561,字符串,第1个字节\x05为标志位,后面是字符'a'

到此,关于“PostgreSQL数据页Page中的行数据分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL数据页Page中的行数据分析

本文链接: https://lsjlt.com/news/65120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PostgreSQL数据页Page中的行数据分析
    这篇文章主要介绍“PostgreSQL数据页Page中的行数据分析”,在日常操作中,相信很多人在PostgreSQL数据页Page中的行数据分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • PostgreSQL的Page中页头和行数据指针分析
    本篇内容介绍了“PostgreSQL的Page中页头和行数据指针分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
  • 分析PostgreSQL中的数据结构HTAB
    这篇文章主要讲解了“分析PostgreSQL中的数据结构HTAB”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析PostgreSQL中的数据结构HTAB”...
    99+
    2024-04-02
  • PostgreSQL中PGPROC数据结构分析
    本篇内容介绍了“PostgreSQL中PGPROC数据结构分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • PostgreSQL zedstore在CentOS 7.4进行大批量数据的测试分析
    这篇文章主要介绍“PostgreSQL zedstore在CentOS 7.4进行大批量数据的测试分析”,在日常操作中,相信很多人在PostgreSQL zedstore在CentOS 7.4进行大批量数据...
    99+
    2024-04-02
  • 如何在ASP网页中使用NumPy进行数据分析?
    数据分析已成为现代企业和科学研究的关键因素。Python中的NumPy库是一个强大的工具,用于处理和分析数值数据。在本文中,我们将探讨如何在ASP网页中使用NumPy进行数据分析。 安装NumPy库 要在ASP网页中使用NumPy,首先...
    99+
    2023-08-12
    自然语言处理 numy apache
  • PHP数组分页中如何进行数据转换?
    数据转换在 php 数组分页中至关重要,以便正确显示和处理分页数据。可以通过以下函数转换数据类型:intval():转换为整数floatval():转换为浮点数strval():转换为字...
    99+
    2024-04-30
    数据转换 php数组分页
  • PostgreSQL中的ProcessRepliesIfAny函数分析
    本篇内容主要讲解“PostgreSQL中的ProcessRepliesIfAny函数分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中的P...
    99+
    2024-04-02
  • 分析PostgreSQL中的synchronous_commit参数
    本篇内容主要讲解“分析PostgreSQL中的synchronous_commit参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析PostgreSQL中的...
    99+
    2024-04-02
  • 如何进行SAP数据中心的分析
    今天就跟大家聊聊有关如何进行SAP数据中心的分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Jerry的前一篇文章企业数字化转型与SAP云平台介绍了SAP云平台在企业数字化转型中的...
    99+
    2023-06-04
  • Hadoop在广告行业中的数据分析
    Hadoop在广告行业中扮演着重要的角色,主要用于处理大量的广告数据,进行数据分析和挖掘。广告行业的数据通常包括用户点击数据、广告投...
    99+
    2024-02-29
    Hadoop
  • layui中数据表格+分页+搜索+checkbox+缓存选中项数据的示例分析
    这篇文章主要介绍了layui中数据表格+分页+搜索+checkbox+缓存选中项数据的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。...
    99+
    2024-04-02
  • 数据分析:消费者数据分析
    数据分析:消费者数据分析 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习...
    99+
    2023-09-01
    数据分析 数据挖掘 python 开发语言
  • 如何使用Python中的数据分析库进行数据处理
    如何使用Python中的数据分析库进行数据处理人们越来越重视数据处理和分析的重要性。随着电子设备的不断普及和互联网的发展,我们每天都会产生大量的数据。要从这些海量的数据中提取有用的信息和洞察,就需要使用强大的工具和技术。Python作为一种...
    99+
    2023-10-22
    Python 数据分析 数据处理
  • Oracle数据行拆分多行的示例分析
    小编给大家分享一下Oracle数据行拆分多行的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单行拆分如果表数据只有一行,...
    99+
    2024-04-02
  • PostgreSQL中的时间序列数据如何存储和分析
    在PostgreSQL中,时间序列数据可以使用timestamp或timestamptz数据类型来存储。timestamp类型存储日...
    99+
    2024-04-02
  • Android页面之间进行数据回传的方法分析
    本文实例讲述了Android页面之间进行数据回传的方法。分享给大家供大家参考,具体如下: 要求:页面1跳转到页面2,页面2再返回页面1同时返回数据 页面1添加如下代码: In...
    99+
    2022-06-06
    方法 数据 Android
  • PostgreSQL中hash_inner_and_outer函数分析
    这篇文章主要讲解了“PostgreSQL中hash_inner_and_outer函数分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL...
    99+
    2024-04-02
  • PostgreSQL中sort_inner_and_outer函数分析
    这篇文章主要讲解了“PostgreSQL中sort_inner_and_outer函数分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL...
    99+
    2024-04-02
  • PostgreSQL中match_unsorted_outer函数分析
    这篇文章主要讲解了“PostgreSQL中match_unsorted_outer函数分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作