前言

在KingbaseES元组头数据中,有一个t_bits数组,用于存储空值位图。当元组中没有null值的时候,t_bits是空的,当元组有null值的列时,t_bits使用一个bit来表示列是否为null。

元组中空值存储在Heap TupleData中的前位,它之后存储的是data数据。

pageinspact插件观察空值存储

创建插件

CREATE EXTENSION pageinspect;

创建测试表

create table t(a int,b int,c int);

insert into t values(2,6,1);
insert into t values(1,NULL,7); TEST=# select * from t;
a | b | c
---+---+---
2 | 6 | 1
1 | | 7
(2 rows)

pageinspact可以观察空值是如何存储的

字段说明:

t_bits数组不为空:10100000,第一和第三个1表示这两列不为空,中间的0表示第二列为空,其余的0表示这些列未被使用。

t_data中的记录不包含空值数据。

TEST=# select * from heap_page_items(get_raw_page('t',0));
lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid | t_data
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+----------+-------+----------------------------
1 | 8152 | 1 | 36 | 2040 | 0 | 0 | (0,1) | 3 | 2304 | 24 | | | \x020000000600000001000000
2 | 8120 | 1 | 32 | 2041 | 0 | 0 | (0,2) | 3 | 2305 | 24 | 10100000 | | \x0100000007000000
(2 rows)

为了看t_bits列更清晰,我们创建表后多加几列

说明:

第四行没有空值,因此对应t_bits数组为空。

一共12列,因此数组中后四位均未用到,均为0。

111111111101中的0表示null值的位置,所以t_bits仅显示出有空值的元组。

create table t02(i1 int,i2 int,i3 int,i4 int,i5 int,i6 int, i7 int,i8 int,i9 int,i10 int,i11 int,i12 int);
insert into t02 values(1,2,3,4,5,6,7,8,9,10,NULL,12);
insert into t02 values(1,2,3,4,5,6,7,8,9,NULL,NULL,12);
insert into t02 values(1,2,3,4,5,6,7,8,NULL,NULL,NULL,12);
insert into t02 values(1,2,3,4,5,6,7,8,9,10,11,12); select t_bits from heap_page_items(get_raw_page('t02', 0)); t_bits ------------------
1111111111010000
1111111110010000
1111111100010000 (4 rows)

观察表中删掉其中一列的效果

alter table t02 drop column i1;
TEST=# select t_bits from heap_page_items(get_raw_page('t02', 0));
t_bits
------------------
1111111111010000
1111111110010000
1111111100010000 位图并没有变化 再插入一行非空值
insert into t02 values(2,3,4,5,6,7,8,9,10,11,12);
TEST=# select t_bits from heap_page_items(get_raw_page('t02', 0));
t_bits
------------------
1111111111010000
1111111110010000
1111111100010000 0111111111110000
(5 rows) 可以看到,表中已删除列为第一列,被视为空列,以0标识,这里的0并不是空值的意思,然后连续出现11个1,表示该元组没有空值。
当表中有许多列时,删除列将为每条记录生成额外的t_bit,这将导致存储膨胀。

KingbaseESV8R6使用pageinspect插件观察空值的更多相关文章

  1. Java垃圾回收_过程观察

    这是今天看JVM垃圾回收的时候做的实验观察. 使用工具:Java VisualVM.VisualVM GC插件 观察应用:Tomcat容器中的Web服务 1. Java VisualVM 在tomca ...

  2. java并发编程(十六)happen-before规则

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...

  3. elk平台搭建

    很多时候我们需要对日志做一个集中式的处理,但是通常情况下这些日志都分布到n台机器上面,导致一个结果就是效率比较低,而ELK平台可以帮助我们解决这么一件事情: ELK下载:https://www.ela ...

  4. Chapter 3: Develop the user experience

    Plan for search engine optimization and accessibility 使用analytical tools分析HTML,如SEO toolkit from MS, ...

  5. 【转】ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

    [转自]https://my.oschina.net/itblog/blog/547250 摘要: 前段时间研究的Log4j+Kafka中,有人建议把Kafka收集到的日志存放于ES(ElasticS ...

  6. ELK日志分析系统搭建(转)

    摘要: 前段时间研究的Log4j+Kafka中,有人建议把Kafka收集到的日志存放于ES(ElasticSearch,一款基于Apache Lucene的开源分布式搜索引擎)中便于查找和分析,在研究 ...

  7. 深入分析 Java 中的中文编码问题

    登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...

  8. [转]深入分析 Java 中的中文编码问题

    收益匪浅,所以转发至此 原文链接: http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 深入分析 Java 中的中文编码问题 编 ...

  9. 用happen-before规则重新审视DCL(转)

    编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...

  10. 用happen-before规则重新审视DCL(转载)

    编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...

随机推荐

  1. STM32的时钟控制RCC和外设定时器

    STM32的RCC(Reset and Clock Control)时钟控制 stm32f103c8的时钟是72MHz, stm32f401ccu6的时钟是80M, 开发板板载两个晶振, 一个高速一个 ...

  2. Springboot+JdbcTemplate模拟SQL注入攻击案例及解决方法

    说明 SQL注入是软件开发项目测试过程中必测项,重要等级极高.本文以springboot项目为例,模拟含有SQL注入攻击,并提供解决方法.部分内容整理自网络. 搭建项目 1.创建表tbuser DRO ...

  3. MyBatis实现多行合并(collection标签使用)

    举个栗子 现有如下表结构,用户表.角色表.用户角色关联表. 一个用户有多个角色,一个角色有可以给多个用户,也即常见的多对多场景. 现有这样一个需求,分页查询用户数据,除了用户ID和用户名称字段,还要查 ...

  4. win32 - 将剪贴板位图存储为文件

    简单的demo: #include <iostream> #include <fstream> #include <windows.h> typedef struc ...

  5. [Android 逆向]绕过小米需插卡安装apk限制

    1. 确保自己手机是root的了 2. 给手机安装busybox,使可以用vi编辑文件 安装方法: 0. adb shell getprop ro.product.cpu.abi 获得 cpu架构信息 ...

  6. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  7. vue upload 图片转base64、转二进制数组,保存编码数据到文件

    功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...

  8. 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009

    问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...

  9. 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

    问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...

  10. Visual Studio部署C++环境下OpenCV库

      本文介绍在Visual Studio 2022中配置.编译C++计算机视觉库OpenCV的方法. 1 OpenCV库配置   首先,我们进行OpenCV库的下载与安装.作为一个开源的库,我们直接在 ...