① pg資料庫數據文件111代表什麼
所有資料庫對象都有各自的oid(object identifiers),oid是一個無符號的四位元組整數,相關對象的oid都存放在相關的system catalog表中,比如資料庫的oid和表的oid分別存放在pg_database,pg_class表中。
1、資料庫集群-Database cluster
2、資料庫-Database
3、表空間-tablespace
資料庫在邏輯上分成多個存儲單元,稱作表空間。表空間用作把邏輯上相關的結構放在一起。資料庫邏輯上是由一個或多個表空間組成。
新創建的資料庫默認創建下面的表空間:
1)Catalog表空間 存放系統表信息2)System表空間 存放用戶數據3)Temp表空間
4、模式-Schema
自動創建的系統模式如下:
1)PG_CATALOG2)PG_LARGEOBJECT3)PG_TOAST4)PG_PARTITION
默認的用戶模式PUBLIC。
5、段-segment
6、區-extent
7、塊-block
8、資料庫對象-Database object
1)模式對象表、索引、序列、大對象、視圖、函數、存儲過程、觸發器、包 … …2)非模式對象用戶、資料庫
9、數據表-Table
10、索引-Index
11、序列-Sequence
12、視圖-View
二、物理存儲結構
在執行initdb的時候會初始化一個目錄,通常我們都會在系統配置相關的環境變數$PGDATA來表示,初始化完成後,會再這個目錄生成相關的子目錄以及一些文件。在postgresql中,tablespace的概念並不同於其他關系型資料庫,這里一個tablespace對應的都是一個目錄。如下圖就是PG的物理結構:
.png
1、存儲系統主要包括三個部分:
內存中:buffer,MemoryContext;
數據文件,臨時文件;
日誌文件,日誌緩存。
2、文件和目錄相關作用描述:
.png
.png
3、數據文件結構
.png
3.1、頁
.png
將數據文件中的空間從邏輯上劃分成一個個頁面(數據塊)。頁面是資料庫I/O的基本單位,即只能整頁讀寫數據文件, 頁面的大小默認是8K。
頁面可以分成兩種:
1)數據頁面:數據頁面是用來存儲用戶數據的。
2)控制頁面:控制頁面用來管理這些數據頁面。
資料庫共享緩存中的空間劃分也是按頁為基本單位, 一個頁的大小與數據文件中頁的大小一致, 這樣便於整頁讀取數據文件,並放入到資料庫Buffer中, 從Buffer寫入數據文件也同理,保證了緩存與數據文件結構和內容上的一致性。
3.2、Block(塊)
概念上基本等同於Page, 但Block更多用於說明DMS中對數據文件中Page的描述。
例如: 對文件的讀寫的操作, 文件讀寫位置的定位, 數據文件空間回收等操作, 單位均是以塊進行。
數據塊的大小在系統初始化時指定,默認是8K,可以取值4K,8K,16K,32K。
3.3、Extent(區)
把數據文件中8個連續的Page構成的空間稱為一個Extent。Extent是資料庫進行數據文件空間分配/釋放的基本單位。每個表、索引、序列對象都是由若干個區組成。數據文件被創建後,除自動保留部分區作為控制區外,其他區全部處於未分配狀態。表、索引、序列對象的所有數據都存放在Extent中,當向這些Extent中插入數據時,若該Extent的所有頁面都已佔滿,系統就會自動在所屬表空間的數據文件中尋找一個尚未分配的區,並將其狀態修改為數據區。
3.4、控制頁面
用於空間管理的控制頁面:PFS/GAM/IAM。
用於增量備份的控制頁面:DCM。
判斷可見性的控制頁面:VM。
預留的控制頁面:BCM/SGAM。
3.5、PFS
Page Free Space,簡稱PFS頁.
用於記錄本數據文件中頁面的空間使用情況。對文件中的每個頁面,PFS中都有一個「位元組」與之對應,該位元組記錄了該頁面的狀態。
PFS頁前64bytes被預留為頁頭, 剩下81024-64=8128一共覆蓋81288K=64MB空間.
故PFS頁每隔8128個頁面出現一次, 系統初始化把第一個PFS頁放在數據文件的第二個頁面位置,即:第1號數據頁面, 由此可知,第N個PFS頁的位置在8128*N+1.
.png
3.6、GAM
Global Allocation Map,簡稱GAM頁。
功能:記錄所在數據文件的Extent的分配情況,GAM頁中除GAM頭外,剩下空間的每一位(bit)均對應一個Extent的分配情況。若某bit位為1,則表明該bit位所關聯的Extent已被分配出去,反之未被分配。
若一個GAM頁面大小為8K,則除GAM頭(64 bytes)外,一個GAM頁面所能覆蓋的文件范圍是: (81024-64)8(88K),約4GB空間。此外,GAM頁每隔881288個頁面出現一個,系統要求第一個GAM頁出現在文件的第3個頁面位置(即:第2個索引位置),由此得知,第N個GAM頁的出現位置是: 881288*N+2
.png
3.7、IAM
Index Allocation Map,簡稱IAM頁。
功能:每個IAM頁只隸屬於一個資料庫對象(例如:表),但一個資料庫對象可包含多個IAM頁,由此可見IAM頁與資料庫對象的關系是1對1,而資料庫對象與IAM頁的關系是1對多.
IAM的結構與GAM頁類似,除IAM頭外,剩下空間的每一位(bit)均對應著一個與IAM相關的Extent。若某bit位為1,則表明該bit位所關聯的Extent已被分配給該IAM,反之未被分配。若一個IAM頁面大小為8K,則除IAM頭(64 bytes)外,一個IAM頁面所能覆蓋的文件范圍是: (81024-64)8(88K),約4GB空間。
但與GAM也不同之處在於:IAM的出現位置不固定,只在在創建資料庫對象的時候才分配。
.png
三、邏輯與物理存儲關系
1、邏輯關系存在表空間;
2、表空間存在對應的數據文件中;
新創建的資料庫對應的數據文件的名稱:
Catalog表空間 – databasename.dbfSystem表空間 – Udatabasename.dbfTemp表空間-- Tdatabasename.dbf
前面加 「U」 前綴代表用戶數據表空間,用於保存用戶表的數據。
不帶 U 代表 是系統表的表空間,用於保存系統表的數據。
U 前綴的數據文件代表的表空間名為PG。
不帶U 的數據文件代表的表空間為 CATALOG。
四、資料庫文件、表空間、其他文件之間的關系
1、關系圖如下:
.png
說明:
1)每一個資料庫具有一個或多個數據文件,用戶存放資料庫的所有數據。
2)資料庫的數據文件有以下特徵:
一個資料庫文件只能與一個資料庫的一個表空間相連。
一個表空間可以由多個數據文件組成。
3)資料庫對象與文件關系:
資料庫對象放到表空間中。
表空間有多個數據文件。
表空間中有多個資料庫對象。
4)資料庫對象邏輯上是存儲在表空間中,物理上是存儲在與表空間相關聯的數據文件中。
2、資料庫包含的文件種類:
1)資料庫文件:data/DB
資料庫對象,如:資料庫、表,索引,序列等對象。
2)控制文件:data/CTL
用來記錄資料庫集群的狀態信息,如:版本信息、集群所管理的各種文件信息、檢查點信息、事務狀態信息等。
3)日誌文件:data/REDOLOG
記錄數據修改操作的日誌,用於系統發生故障時進行數據恢復。
4)臨時文件:data/DB
存放資料庫進行計算的過程中,生成的各種中間對象,如排序運算的外存歸並單元。
5)參數文件:data目錄下
五、Postgresql 底層存儲管理方式:
Postgresql的每個資料庫均存放在一個目錄中,以db_oid命名,該目錄中存放每個表對應的文件,文件名以該數據表對應的relfilenode_oid命名。當表中的數據量足夠大,導致表文件的大小大於1GB的時候,postgresql會自動創建新的文件用於存放新插入的數據。新文件的名稱為: relfilenode_iod.1, relfilenode_iod.2 等。使用該策略是為了防止在某些文件系統中,最大支持文件尺寸不能大於1GB的情形。
db_oid, relfilenode_oid可以從pg_class系統表中查詢得出。
② 如何查PostgreSQL 資料庫中所有的表
1、通過命令行查詢
\d 資料庫 —— 得到所有表的名字
\d 表名 —— 得到表結構
2、通過SQL語句查詢
"select * from pg_tables" —— 得到當前db中所有表的信息(這里pg_tables是系統視圖)
"select tablename from pg_tables where schemaname='public'" —— 得到所有用戶自定義表的名字(這里"tablename"欄位是表的名字,"schemaname"是schema的名字。用戶自定義的表,如果未經特殊處理,默認都是放在名為public的schema下)
③ PostgreSQL一個資料庫最大支持多少個表
這個和表的數量沒有關系,要看每個表的大小和你的資料庫的大小.一般 表的大小*數量 < 資料庫的大小
④ pgsql怎樣創建表,資料庫等
打開軟體,進入界面中。
雙擊「PostgresSQL 9.3」連接伺服器
方法一:右鍵單擊「postgres」,選擇「新建對象」--新建資料庫,設置新的資料庫的參數,所有者一般默認為「postgres」
新建完後,不能立即看到界面上更新的數據,需要點擊界面上的更新按鈕才能夠看到資料庫的變化情況。
方法二:在插件中輸入SQL語言,運行命令
方法三:點擊面板上的「執行任意的SQL查詢」
⑤ MySQL與PostgreSQL比較 哪個資料庫更好
特性 MySQL PostgreSQL
實例 通過執行 MySQL 命令(mysqld)啟動實例。一個實例可以管理一個或多個資料庫。一台伺服器可以運行多個 mysqld 實例。一個實例管理器可以監視 mysqld 的各個實例。
通過執行 Postmaster 進程(pg_ctl)啟動實例。一個實例可以管理一個或多個資料庫,這些資料庫組成一個集群。集群是磁碟上的一個區域,這個區域在安裝時初始化並由一個目錄組成,所有數據都存儲在這個目錄中。使用 initdb 創建第一個資料庫。一台機器上可以啟動多個實例。
資料庫 資料庫是命名的對象集合,是與實例中的其他資料庫分離的實體。一個 MySQL 實例中的所有資料庫共享同一個系統編目。 資料庫是命名的對象集合,每個資料庫是與其他資料庫分離的實體。每個資料庫有自己的系統編目,但是所有資料庫共享 pg_databases。
數據緩沖區 通過 innodb_buffer_pool_size 配置參數設置數據緩沖區。這個參數是內存緩沖區的位元組數,InnoDB 使用這個緩沖區來緩存表的數據和索引。在專用的資料庫伺服器上,這個參數最高可以設置為機器物理內存量的 80%。 Shared_buffers 緩存。在默認情況下分配 64 個緩沖區。默認的塊大小是 8K。可以通過設置 postgresql.conf 文件中的 shared_buffers 參數來更新緩沖區緩存。
資料庫連接 客戶機使用 CONNECT 或 USE 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。 客戶機使用 connect 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。
身份驗證 MySQL 在資料庫級管理身份驗證。 基本只支持密碼認證。 PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證
加密 可以在表級指定密碼來對數據進行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。可以通過 SSL 連接實現網路加密。 可以使用 pgcrypto 庫中的函數對列進行加密/解密。可以通過 SSL 連接實現網路加密。
審計 可以對 querylog 執行 grep。 可以在表上使用 PL/pgSQL 觸發器來進行審計。
查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。
備份、恢復和日誌 InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟體才能支持熱備份。 在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。
JDBC 驅動程序 可以從 參考資料 下載 JDBC 驅動程序。 可以從 參考資料 下載 JDBC 驅動程序。
表類型 取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 支持臨時表、常規表以及范圍和列表類型的分區表。不支持哈希分區表。 由於PostgreSQL的表分區是通過表繼承和規則系統完成了,所以可以實現更復雜的分區方式。
索引類型 取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。
約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。
存儲過程和用戶定義函數 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數可以用 SQL、C 和 C++ 編寫。 沒有單獨的存儲過程,都是通過函數實現的。用戶定義函數可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。
觸發器 支持行前觸發器、行後觸發器和語句觸發器,觸發器語句用過程語言復合語句編寫。 支持行前觸發器、行後觸發器和語句觸發器,觸發器過程用 C 編寫。
系統配置文件 my.conf Postgresql.conf
資料庫配置 my.conf Postgresql.conf
客戶機連接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
數據訪問和管理伺服器 OPTIMIZE TABLE —— 回收未使用的空間並消除數據文件的碎片
myisamchk -analyze —— 更新查詢優化器所使用的統計數據(MyISAM 存儲引擎)
mysql —— 命令行工具
MySQL Administrator —— 客戶機 GUI 工具 Vacuum —— 回收未使用的空間
Analyze —— 更新查詢優化器所使用的統計數據
psql —— 命令行工具
pgAdmin —— 客戶機 GUI 工具
並發控制 支持表級和行級鎖。InnoDB 存儲引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務級設置隔離級別。 支持表級和行級鎖。支持的 ANSI 隔離級別是 Read Committed(默認 —— 能看到查詢啟動時資料庫的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務啟動之前提交的結果)。使用 SET TRANSACTION 語句在事務級設置隔離級別。使用 SET SESSION 在會話級進行設置。
MySQL相對於PostgreSQL的劣勢:
MySQL
PostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整個MySQL資料庫都由Oracle控制。
BSD協議,沒有被大公司壟斷。
對復雜查詢的處理較弱,查詢優化器不夠成熟
很強大的查詢優化器,支持很復雜的查詢處理。
只有一種表連接類型:嵌套循環連接(nested-loop),不支持排序-合並連接(sort-merge join)與散列連接(hash join)。
都支持
性能優化工具與度量信息不足
提供了一些性能視圖,可以方便的看到發生在一個表和索引上的select、delete、update、insert統計信息,也可以看到cache命中率。網上有一個開源的pgstatspack工具。
InnoDB的表和索引都是按相同的方式存儲。也就是說表都是索引組織表。這一般要求主鍵不能太長而且插入時的主鍵最好是按順序遞增,否則對性能有很大影響。
不存在這個問題。
大部分查詢只能使用表上的單一索引;在某些情況下,會存在使用多個索引的查詢,但是查詢優化器通常會低估其成本,它們常常比表掃描還要慢。
不存在這個問題
表增加列,基本上是重建表和索引,會花很長時間。
表增加列,只是在數據字典中增加表定義,不會重建表
存儲過程與觸發器的功能有限。可用來編寫存儲過程、觸發器、計劃事件以及存儲函數的語言功能較弱
除支持pl/pgsql寫存儲過程,還支持perl、python、Tcl類型的存儲過程:pl/perl,pl/python,pl/tcl。
也支持用C語言寫存儲過程。
不支持Sequence。
支持
不支持函數索引,只能在創建基於具體列的索引。
不支持物化視圖。
支持函數索引,同時還支持部分數據索引,通過規則系統可以實現物化視圖的功能。
執行計劃並不是全局共享的, 僅僅在連接內部是共享的。
執行計劃共享
MySQL支持的SQL語法(ANSI SQL標准)的很小一部分。不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(分析函數)。
都 支持
不支持用戶自定義類型或域(domain)
支持。
對於時間、日期、間隔等時間類型沒有秒以下級別的存儲類型
可以精確到秒以下。
身份驗證功能是完全內置的,不支持操作系統認證、PAM認證,不支持LDAP以及其它類似的外部身份驗證功能。
支持OS認證、Kerberos 認證 、Ident 的認證、LDAP 認證、PAM 認證
不支持database link。有一種叫做Federated的存儲引擎可以作為一個中轉將查詢語句傳遞到遠程伺服器的一個表上,不過,它功能很粗糙並且漏洞很多
有dblink,同時還有一個dbi-link的東西,可以連接到oracle和mysql上。
Mysql Cluster可能與你的想像有較大差異。開源的cluster軟體較少。
復制(Replication)功能是非同步的,並且有很大的局限性.例如,它是單線程的(single-threaded),因此一個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master.
有豐富的開源cluster軟體支持。
explain看執行計劃的結果簡單。
explain返回豐富的信息。
類似於ALTER TABLE或CREATE TABLE一類的操作都是非事務性的.它們會提交未提交的事務,並且不能回滾也不能做災難恢復
DDL也是有事務的。
PostgreSQL主要優勢:
1. PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。oracle資料庫不用說了,是商業資料庫,不開放。而MySQL資料庫雖然是開源的,但現在隨著SUN被oracle公司收購,現在基本上被oracle公司控制,其實在SUN被收購之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的數據都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場范圍與oracle資料庫的市場范圍沖突時,oracle公司必定會犧牲MySQL,這是毫無疑問的。
2. 與PostgreSQl配合的開源軟體很多,有很多分布式集群軟體,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫分離、負載均衡、數據水平拆分等方案,而這在MySQL下則比較困難。
3. PostgreSQL源代碼寫的很清晰,易讀性比MySQL強太多了,懷疑MySQL的源代碼被混淆過。所以很多公司都是基本PostgreSQL做二次開發的。
4. PostgreSQL在很多方面都比MySQL強,如復雜SQL的執行、存儲過程、觸發器、索引。同時PostgreSQL是多進程的,而MySQL是線程的,雖然並發不高時,MySQL處理速度快,但當並發高的時候,對於現在多核的單台機器上,MySQL的總體處理性能不如PostgreSQL,原因是MySQL的線程無法充分利用CPU的能力。
目前只想到這些,以後想到再添加,歡迎大家拍磚。
PostgreSQL與oracle或InnoDB的多版本實現的差別
PostgreSQL與oracle或InnoDB的多版本實現最大的區別在於最新版本和歷史版本是否分離存儲,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了數據,索引本身沒有分開。
PostgreSQL的主要優勢在於:
1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對於oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會導致數據丟失,甚至資料庫無法啟動的嚴重問題。另由於PostgreSQL沒有回滾段,舊數據都是記錄在原先的文件中,所以當資料庫異常crash後,恢復時,不會象oracle與Innodb資料庫那樣進行那麼復雜的恢復,因為oracle與Innodb恢復時同步需要redo和undo。所以PostgreSQL資料庫在出現異常crash後,資料庫起不來的幾率要比oracle和mysql小一些。
2. 由於舊的數據是直接記錄在數據文件中,而不是回滾段中,所以不會象oracle那樣經常報ora-01555錯誤。
3. 回滾可以很快完成,因為回滾並不刪除數據,而oracle與Innodb,回滾時很復雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更新的記錄要更新回來(見row_undo函數),同時回滾的過程也會再次產生大量的redo日誌。
4. WAL日誌要比oracle和Innodb簡單,對於oracle不僅需要記錄數據文件的變化,還要記錄回滾段的變化。
PostgreSQL的多版本的主要劣勢在於:
1、最新版本和歷史版本不分離存儲,導致清理老舊版本需要作更多的掃描,代價比較大,但一般的資料庫都有高峰期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進一步被加強了。
2、由於索引中完全沒有版本信息,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;
進程模式與線程模式的對比
PostgreSQL和oracle是進程模式,MySQL是線程模式。
進程模式對多CPU利用率比較高。
進程模式共享數據需要用到共享內存,而線程模式數據本身就是在進程空間內都是共享的,不同線程訪問只需要控制好線程之間的同步。
線程模式對資源消耗比較少。
所以MySQL能支持遠比oracle多的更多的連接。
對於PostgreSQL的來說,如果不使用連接池軟體,也存在這個問題,但PostgreSQL中有優秀的連接池軟體軟體,如pgbouncer和pgpool,所以通過連接池也可以支持很多的連接。
⑥ 在postgresql中如何從資料庫中檢索出所有的表名
1、查看當前資料庫中所有的模式。
⑦ pg資料庫的db怎麼查看錶關聯
一、資料庫的多表連接查詢,inner的不同用法
在pg資料庫中建立兩張表:
t_a和t_b如下所示:
t_a:
t_b:
1、inner join(內連接)
inner join就是根據on欄位標示出來的條件,查詢關聯的表中符合條件的數據,並把他前部都顯示出來,形成一個結果集。
執行如下語句:
select * from t_a inner join t_b on t_a.adi=t_b.bid
得到的結果為:
這樣的查詢會顯示出所有的數據,如果我們僅僅需要一部分的數據(例如我們只想查出t_a中所有aid和t_b中的bid相同的數據),那麼查詢語句應該變成:
select t_a.* from t_a inner join t_b on t_a.aid=t_b.bid
那麼得到的數據如下所示,就只顯示了t_a表中的數據。如下:
要排除重復的數據,在select後加distinct即可。
2、left join
left join 就是以表t_a為基礎從右表t_b中查詢出所有符合on條件的結果,在合並到表t_a中對應的部分,再作為一個結果集輸出,在結果集中,會顯示出表t_a中的所有數據。
執行如下查詢語句:
select * from t_a left join t_b on t_a.aid=t_b.bid
得到如下結果:
可以看到,在查詢的結果中,有一行關於表t_b的數據都為null,因為表t_b中沒有符合on條件的數據。但是表t_a表顯示出了全部的數據。那麼在需要篩選的時候,應該著重於篩選表t_b中的數據,如果執行如下的語句:
select t_a.* from t_a left join t_b on t_a.aid=t_b.bid
那麼得到的就是表t_a中的所有數據,那麼這個查詢就顯得沒有意義了。
3、right join
right join 就是以表t_b為基礎從左表t_a中查詢出所有符合on條件的結果,在合並到表t_b中對應的部分,再作為一個結果集輸出,在結果集中,會顯示出表t_b中的所有數據。
執行如下查詢語句:
select * from t_a right join t_b on t_a.aid=t_b.bid
得到的結果為:
可以看到,查詢的結果中,有兩行數據在表t_a的對應部分都是null的,表示表t_a中沒有符合on條件的數據,但是表t_b顯示了全部的數據,那麼需要做條件篩選的時候,我們就應該主要針對表t_a進行篩選。
二、查詢一個父級的所有子級(包括子級的子級)
在pg資料庫中建立一張表t_c如下:
要查出cid為1的所有的子級、包括cid為2、3、5的子級的集合。執行以下sql語句
with recursive tb as(select * from t_c where parent_id='1' union all select t_c.* from t_c,tb where t_c.parent_id=tb.cid )select * from tb
得到如下的結果:
由查詢出的結果集可以看到,我們查詢出了除了父級(cid為1)以外的所有cid為父級的子級以及子級的子級。
我們來解析一下這個sql語句:
顯而易見的,這是一個遞歸的查詢方法。首先是with為查詢語句提供了輔助功能,可以看做是查詢語句中的臨時表,其次recursive是sql中遞歸的關鍵字,只有有了這個關鍵字,pg才知道with這個語句需要做遞歸操作。union all是去重的,t_c.parent_id=tb.cid 表示了t_c的parent_id要等於臨時表tb的cid要在整個with語句的外面查詢建立的臨時表tb,才能得到所有的子級的集合。
⑧ PG里如何查看錶,索引,表空間,資料庫大小
--查詢一個索引大小 select pg_size_pretty(pg_relation_size('indexname))--查看一張表及此它上的索引總大小 select pg_size_pretty(pg_total_relation_size('tablename')); --查看所有 schema裡面索引大小,大到小的順序排列: select indexrelname,pg_size_pretty( pg_relation_size(relid)) from pg_stat_user_indexes where schemaname = 'schemaname' order by pg_relation_size(relid) desc;--查看所有 schema裡面表的大小,從大到小順序排列: select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname = 'schemaname' order by pg_relation_size(relid) desc; --查看資料庫大小: select pg_database.datname,pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_database;--查看錶空間大小