postgresql之ctid的淺談

来源:http://www.cnblogs.com/lottu/archive/2016/06/24/5613098.html
-Advertisement-
Play Games

ctid: 表示數據記錄的物理行當信息,指的是 一條記錄位於哪個數據塊的哪個位移上面。 跟oracle中偽列 rowid 的意義一樣的;只是形式不一樣。 例如這有個一表test;查看每行記錄的ctid情況 mydb=> select ctid,* from test; ctid | id | nam ...


   ctid: 表示數據記錄的物理行當信息,指的是 一條記錄位於哪個數據塊的哪個位移上面。 跟oracle中偽列 rowid 的意義一樣的;只是形式不一樣。    例如這有個一表test;查看每行記錄的ctid情況
mydb=> select ctid,* from test;
 ctid  |  id  |  name  
-------+------+--------
 (0,1) | 1001 | lottu
 (0,2) | 1002 | rax
 (0,3) | 1003 | xuan
 (0,4) | 1004 | li0924
 (0,5) | 1001 | ak
    格式(blockid,itemid):拿其中(0,1)來說;0表示塊id;1表示在這塊第一條記錄。     1. 去重:  我們知道rowid在oracle有個重要的作用;被用作表記錄去重;同理 ctid在postgresql裡面同樣可以使用。例如test表id為1001有兩條記錄;現在演示下;
mydb=> delete from test where ctid not in (select min(ctid) from test group by id);
DELETE 1
mydb=> select ctid,* from test;
 ctid  |  id  |  name  
-------+------+--------
 (0,1) | 1001 | lottu
 (0,2) | 1002 | rax
 (0,3) | 1003 | xuan
 (0,4) | 1004 | li0924
(4 rows)

剛剛我們刪除了(0,5)這條記錄; 現在我們把這條記錄插入下;看下;

mydb=> insert into test values (1001,'ak');
INSERT 0 1
mydb=> select ctid,* from test;
 ctid  |  id  |  name  
-------+------+--------
 (0,1) | 1001 | lottu
 (0,2) | 1002 | rax
 (0,3) | 1003 | xuan
 (0,4) | 1004 | li0924
 (0,6) | 1001 | ak
(5 rows)

奇怪了;為什麼不是(0,5),而是(0,6)這個跟postgresql多版本事務有關;跟偽列cmin,cmax有關;跟本文講的ctid沒點關係;這是postgresql的特性;也就是這樣;postgresql裡面沒有回滾段的概念;那怎麼把(0,5)在顯示呢;想這塊(0,5)的空間再存放數據;postgresql裡面有AUTOVACUUM進程;當然我們也可以手動回收這段空間;

mydb=> delete from test where name = 'ak';
DELETE 1
mydb=> vacuum test;          
VACUUM
mydb=> insert into test values (1001,'ak');
INSERT 0 1
mydb=> select ctid,* from test;
 ctid  |  id  |  name  
-------+------+--------
 (0,1) | 1001 | lottu
 (0,2) | 1002 | rax
 (0,3) | 1003 | xuan
 (0,4) | 1004 | li0924
 (0,5) | 1001 | ak
(5 rows)

2. 我們剛剛說道 0表示塊id; test數據太少了;不好解釋;新建一個表test2

mydb=> drop table test2;
DROP TABLE
mydb=> create table test2 (id int primary key, name varchar(10));
CREATE TABLE
mydb=> insert into test2 select generate_series(1,1000),'lottu' || generate_series(1,1000);
INSERT 0 1000

 我們看下id=1000的ctid的blockid是多少;答案是5;意思是說該表的記錄記錄到第6個塊;(因為是從0開始的)

mydb=> select ctid,* from test2 where id = 1000;
  ctid  |  id  |   name    
--------+------+-----------
 (5,75) | 1000 | lottu1000
(1 row)
當然這樣查表記錄占了幾個block;假如我這是隨機插入的;那id=1000;就不一定是在第6塊; 我們可以藉助系統視圖pg_class;其中relpages,reltuples分別代表塊數,記錄數!
mydb=> analyze test2;
ANALYZE
mydb=> select relpages,reltuples from pg_class where relname = 'test2';
 relpages | reltuples 
----------+-----------
        6 |      1000
(1 row)
總結: ctid存在的意義:表示數據記錄的物理行當信息,指的是 一條記錄位於哪個數據塊的哪個位移上面。 跟oracle中偽列 rowid 的意義一樣的;只是形式不一樣。 vacuum: 回收未顯示的物理位置;標明可以繼續使用。 generate_series: 為一個序列函數;例如1-100;就是generate_series(1,100);0-100直接的偶數generate_series(0,100,2)                           其中的0表示序列開始位置;100代表結束位置;2為偏移量。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • WOL(從網卡喚醒)諸多限制,內網都不穩定,外網更不用說,放棄 斷電恢覆上次狀態,必須的 通電即開機,必須的 WIFI智能開關一個 受管理的伺服器 Esxi 6 2台,windows 2012 2台 統一使用WIFI開關,esxi6設置SSH自啟動,設置VM隨主機開關機,HYPERV設置VM自啟動 ... ...
  • ld --verbose | grep SEARCH ...
  • 如何保護你的linux操作系統 如何保護你的linux操作系統 導讀 在現在這個世道中,Linux操作系統的安全是十分重要的。但是,你得知道怎麼乾。一個簡單反惡意程式軟體是遠遠不夠的,你需要採取其它措施來協同工作。那麼試試下麵這些手段吧。 使用SELinux SELinux是用來對Linux進行安全 ...
  • Background Today I did stupid things that I went into the ~/Downloads/ and pressed [Alt] + [A] then [Shift] + [Delete]. Wtf... I didn't want to delete ...
  • idr在linux內核中指的就是整數ID管理機制,從本質上來說,這就是一種將整數ID號和特定指針關聯在一起的機制。這個機制最早是在2003年2月加入內核的,當時是作為POSIX定時器的一個補丁。現在,在內核的很多地方都可以找到idr的身影。 idr機制適用在那些需要把某個整數和特定指針關聯在一起的地 ...
  • powerline是vim的狀態欄插件,同時也提供狀態欄和提示視窗功能給其他一些應用,包括zsh,bash,tmux,IPython,Awesome,i3 和 Qtile。這篇文字只談vim上的安裝。 環境與工具 系統:OS X EI Capitan version 10.11.5 終端:termi ...
  • 方法一: 新建共用目錄存放腳本文件,需要應用的用戶或組授予只讀許可權 方法二: 將腳本放到在\\IP或主機名\sysvol\功能變數名稱\Policies\唯一ID\USER\Scripts\Logon(登錄) SYSVOL:是存儲域公共文件伺服器副本的共用文件夾,它們在域中所有的域控制器之間複製。 Sysv ...
  • 封裝virtio驅動到windows2008R2原版iso中1. 使用UltraISO將wim文件install.vim,boot.vim拷出到D盤2. 準備執行命令載入驅動,命令僅提供install.wim,boot.wim與install安裝方式相同,包含在第5節腳本中2.1 管理員身份打開CM... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...