1. 程式人生 > >PostgreSQL儲存空間複用測試

PostgreSQL儲存空間複用測試

最近有朋友問如下問題:

       一個表中的資料經過增刪改後並執行vacuum table操作後,發現後續插入的記錄的ctid比老的資料還要小,這是為什麼。

原因:這是空間重複利用的結果,是正常的。由於資料的記錄是儲存在某個塊中的,當資料被刪除後該記錄的地方在塊中就會形成空洞,如果沒有任何事物再需要這個記錄的時候,經過vacuum操作後,就會標識這條記錄的空間可以被重複利用了,也就是說新插入的記錄是可以放到該位置了,這個地方的ctid比老記錄的ctid小就是正常的了。

     測試結果:

     1. 建立一張測試表,並向表中插入100w條測試記錄。

sde=# create table t4 (id int,info text);
CREATE TABLE
sde=# insert into t4 select generate_series(1,1000000),md5(random()::text);
INSERT 0 1000000

    2. 查詢記錄id從1000到1010這幾條記錄的ctid。

sde=# select ctid from t4 where id>10000 and id<10010;
  ctid
---------
 (83,41)
 (83,42)
 (83,43)
 (83,44)
 (83,45)
 (83,46)
 (83,47)
 (83,48)
 (83,49)
(9 行記錄)

   3. 刪除這幾條記錄,並vacuum。

sde=# delete  from t4 where id>10000 and id<10010;
DELETE 9
sde=# vacuum verbose t4;
INFO:  vacuuming "sde.t4"
INFO:  "t4": removed 9 row versions in 1 pages
INFO:  "t4": found 9 removable, 999991 nonremovable row versions in 8334 out of 8334 pages
描述:  0 dead row versions cannot be removed yet, oldest xmin: 873827
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.25 s, system: 0.00 s, elapsed: 0.25 s.
INFO:  vacuuming "pg_toast.pg_toast_52633"
INFO:  index "pg_toast_52633_index" now contains 0 row versions in 1 pages
描述:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO:  "pg_toast_52633": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
描述:  0 dead row versions cannot be removed yet, oldest xmin: 873827
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM

  發現清除了9條記錄。

  5. 繼續插入幾條記錄

sde=# insert into t4 values (1000001,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000002,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000003,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000004,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000005,md5(random()::text));
INSERT 0 1
sde=# select ctid from t4 where id>=1000001 ;
  ctid
---------
 (83,41)
 (83,42)
 (83,43)
 (83,44)
 (83,45)
(5 行記錄)

  可以看到新插入的記錄放到了剛才刪除的那幾條記錄的位置上,繼續插入

sde=# insert into t4 values (1000006,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000007,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000008,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000009,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (10000010,md5(random()::text));
INSERT 0 1
sde=# select ctid from t4 where id>=1000001 ;
   ctid
-----------
 (83,41)
 (83,42)
 (83,43)
 (83,44)
 (83,45)
 (83,46)
 (83,47)
 (83,48)
 (83,49)
 (8333,41)
(10 行記錄)

   當把塊內的空洞沾滿後,新插入的記錄會放到最後一個塊上了。

相關推薦

PostgreSQL儲存空間測試

最近有朋友問如下問題:        一個表中的資料經過增刪改後並執行vacuum table操作後,發現後續插入的記錄的ctid比老的資料還要小,這是為什麼。 原因:這是空間重複利用的結果,是正常的。由於資料的記錄是儲存在某個塊中的,當資料被刪除後該記錄的地方在塊中就會

Jenkins外掛的儲存

1. 為什麼要儲存Jenkins外掛   在部分公司中,Jenkins的安裝是執行在公司的內網中的,在內網中,有的是不能與外網相連通的,也就是說有的公司其開發環境就是在公司內網中進行的,在這種情況下公司中的內網無法連線外網,自然也就無法下載Jenkins外掛了

【原創】Selenium學習系列之(七)—ConnectDB和測試方法

一篇來說一下Webdriver中連線DB合複用測試方法。 兩個完全不搭邊的東西怎麼說明呢,既然不好說那就不多說,通過例子來理解。 需求我們要實現一個這樣的測試情境: 登入系統時,若loginID正確,但密碼錯誤,連續三次密碼輸入錯誤後,系統會lock user。 怎麼實現呢

UDP埠測試程式碼

具體不多說,看註釋。 // udp.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <windows.h> #include <winsock2.h> #pragma comment(lib

keras系列之儲存模型

keras 模型儲存與複用 這個部落格寫的很好,大體上參考這個 注意checkpoint的使用 ############################### from keras.models import load_model model.save('m

基於Jmeter的PostgreSQL空間性能測試筆記

查詢 數據導入 bsp img alt com 二維 部署 添加 這是很早之前做過的一個測試,最近在整理postgresql測試相關的資料,所以也把它拿出來了與大家分享。 首先解釋一下所謂的PostgreSQL空間性能,主要是基於postgis的空間數據導入性能,詳細的po

PostgreSQL即學即:庫、表空間、角色、SCHEMA

前置 sudo su - postgres // 切換到postgres使用者 1、PostgreSQL會在安裝階段預設建立一個超級使用者角色和一個database,均是postgres, a、修改PostgreSQL資料庫預設使用者postgres的密碼 sudo  pa

MyEclipse 工作空間配置的

原工作空間 :A 現工作空間 :B 首先,匯出A中的配置 開啟A,選擇file --> Export --> 在彈出框中選擇General 下的preference --> next --> 在export preferenc

從零開始一個http伺服器(六)-多路和壓力測試

從零開始一個http伺服器(六)-多路複用和壓力測試 程式碼地址 : https://github.com/flamedancer/cserver git checkout step6 執行: make clean && make && ./myserver.out 測試 瀏

在ListView中動態新增EditText並對其中的資料進行儲存和由於引起的Editext中的內容顯示異常的解決方案

public class AddAdapter extends BaseAdapter { private Context context; //需要增加的條目用一個Map儲存 private Map edItem; //記錄增加的條目數,作為下標給deItem賦值,可以不要

SOAPUI測試步驟進行斷言

包含 繼續 sts 技術分享 soap 按鈕 table 限定 填充 soapUI提供兩種斷言方法:TestSteps中添加斷言和Assertion TestStep(僅限PRO版本)。 Assertion TestStep擴展了斷言處理和管理的想法。此功能允許創建簡單到復

Win10組策略命名空間解決方法

windows 組策略 軟媒魔方 對很多資深電腦用戶來說“組策略編輯器”並不陌生,使用組策略編輯器可以對系統進行一些更深度的設置。不過最近有Win10用戶反饋“組策略”打開後總是彈出“命名空間……已經被定義為存儲中另一文件的目標命名空間”的對話框,雖然點擊“確定”後可以關閉,而且不影響組策略功能,

Oracle表空間戶、授權管理

manage tables 空間 gin 創建 tempfile max ide 指定 1、查詢表空間位置 select * from dba_data_files; -->d:\app\administrator\oradata\orcl\***.dbf 2、查看臨

oracle第二步創建表空間戶、授權

toe 數據 表空間 nag gem 分享 reat 登錄 light Windows+r→鍵入sqlplus,輸入已安裝好的oracle數據庫超級管理員賬號密碼登錄。顯示: 成功。 創建表空間: 創建用戶並默認表空間: 授權該創建用戶對數據庫的操作: 代碼:

Map存儲容量及內存占測試

print eem 內存占用 () out end sta 垃圾 free Integer a = 1; long start = 0; long end = 0; // 先垃圾回收 System.gc();

Oracle Rac創建表空間

tput rod end put use pac str exce source 1. 創建表空間: BEGIN DECLARE cnt integer := 0; BEGIN SELECT 1 INTO cnt FROM dual WHERE exists(SE

postgresql (PG) 字段逗號 “,”隔開 判斷是否含有某個值

pg 字符串轉換成數組如有一個student 學生表student表中有字段 課程字段 分別用 1,2,3,4,5,6,7 表示不通的7門課程CREATE TABLE student( name varchar(255), course varchar(255))insert into student

1-18Linux內核空間空間

c++ inux comm ksh tcs int ++ .cn ash 轉載請說明出處:http://www.cnblogs.com/zaifeng0108/p/7364411.html OS的接口有兩類: GUI:Graphic User Interface GNo

查看ubuntu磁盤空間及占空間大的文件

讀取 ash bsp 空間占用 服務 啟動服務 blog bug 磁盤利用率 最近老是收到 ecs上有臺服務器的磁盤利用率高 終於有一天 ssh登不上去了 http://blog.csdn.net/aaashen/article/details/50685988

Toad for Oracle創建數據庫表空間

創建數據庫 ssi 密碼 ble src base ace 創建用戶 pac 打開Toad, 1,菜單欄Session—>new Connection….打開如下窗口: 2,進入之後,菜單DatebaseàSechema Brower。。。找到Table Spa