postgresql 資料庫速度慢

2021-09-01 16:35:23 字數 2667 閱讀 3731

公司有個導資料的工具,是把資料庫裡面的一條條記錄生成sql檔案, 然後匯入到別的資料庫裡面,在匯入sql檔案的時候非常慢, 以前沒有這個問題。 後來網上查了下,也做了實驗都沒有效果。 後來看了下postgresql sql的手冊看了下系統的表,發現有個表可以檢視表所占用的空間,和檢視之類的.

觀察磁碟使用情況

table of contents

25.1. 判斷磁碟的使用量

25.2. 磁碟滿導致的失效

本章討論如何觀察postgresql資料庫系統的磁碟使用情況。

25.1. 判斷磁碟的使用量

每個表都有乙個主堆的磁碟檔案,大多數資料都儲存在這裡。如果乙個表有著可能會很長的字段, 則另外還有乙個toast檔案與這個表相關聯, 用於儲存因為數值太長而不能儲存在主表裡面的資料(參閱 section 50.2)。 如果有這個擴充套件表,那麼表上會有乙個toast索引。 當然,同時還可能有索引和基表關聯。 每個表和索引都存放在單獨的磁碟檔案裡 — 如果檔案超過一吉,甚至可能多於乙個檔案。 這些檔案的命名原則在 section 50.1 裡描述。

你可以從三個地方監視磁碟空間:從 psql 裡使用 vacuum 的資訊,從 psql 裡使用 contrib/dbsize 裡面的工具,以及在命令列上使用 contrib/oid2name 裡面的工具。如果 psql 和任何最近剛剛清理(或者分析過)的資料庫進行聯接, 那麼我們可以用查詢來檢視任意表的磁碟使用:

select relfilenode, relpages from pg_class where relname = 'customer';

relfilenode | relpages

-------------+----------

16806 | 60

(1 row)

每個頁通常都是 8 k位元組。(記住,relpages只是由 vacuum, analyze 和幾個 ddl 命令,比如create index 所更新。) 如果你想直接檢查表的磁碟檔案,那麼 relfilenode 應該有用。

要顯示 toast 的表使用的空間,我們可以使用乙個類似下面這樣的查詢:

select relname, relpages

from pg_class,

(select reltoastrelid from pg_class

where relname = 'customer') ss

where oid = ss.reltoastrelid

or oid = (select reltoastidxid from pg_class

where oid = ss.reltoastrelid)

order by relname;

relname | relpages

----------------------+----------

pg_toast_16806 | 0

pg_toast_16806_index | 1

你也可以很容易地顯示索引的用量:

select c2.relname, c2.relpages

from pg_class c, pg_class c2, pg_index i

where c.relname = 'customer'

and c.oid = i.indrelid

and c2.oid = i.indexrelid

order by c2.relname;

relname | relpages

----------------------+----------

customer_id_indexdex | 26

我們很容易用下面的資訊找出最大的表和索引:

select relname, relpages from pg_class order by relpages desc;

relname | relpages

----------------------+----------

bigtable | 3290

customer | 3144

contrib/dbsize 向我們的資料庫裡裝載一些函式,這些函式 允許我們在 psql 裡找出乙個表或者乙個資料庫的大小,而且不用 vacuum或者 analyze。

你也可以使用 oid2name 顯示磁碟用量。參閱 該目錄中的 readme.oid2name 獲取例子。它包括乙個為每個 資料庫顯示磁碟用量的指令碼。

根據上面查詢出rightgrouptable占用了很大的空間, 有5g多, 導致寫入資料很慢, 系統有張表示目錄樹,而且做了許可權的,每個使用者都有節點的許可權,這種設定導致了grouptable資料量非常大,而且現有的系統不再使用該錶,這裡需要清理一下表資料, 使用命令:

truncate table rightgrouptable

這個相當於刪除rightgrouptable裡面的所有資料, truncate比delete 快不少。

select relname, relpages from pg_class order by relpages desc limit 100 再查詢下,表空間占用就少了不少,然後再匯入資料就不再慢。

postgresql模板資料庫

template0和template1為postgresql資料庫的模板資料庫,新建的資料庫預設使用template1作為模板。template0和template1的區別在於template0無法修改,因此你可以修改template1資料庫以定製新建立的資料庫。template資料庫無法被刪除 d...

postgresql資料庫安裝

安裝並初始化 1 解壓資料庫並放到指定目錄 在opt目錄下 tar xvzf postgresql 10.1 1 linux x64 binaries.tar.gz 解壓出來之後目錄為pgsql 2 mv pgsql usr local pgsql 3 建立pgsql使用者並設定密碼 useradd...

資料庫 postgresql 安裝

當前專案是使用django框架搭建介面層的業務,資料庫端使用了postgresql,這裡只是簡單記錄下自己的安裝流程,因為開發機器使用的mac,所以流程只是針對mac。這裡我使用的homebrew,這個工具就不多說了,沒有用過的可以到這裡 執行下面命令即可 brew install postgres...