Postgresql
是否正在使用我的 postgres 索引?
我有一個用於生產的大型 PostgeSQL 9.1 數據庫。我想釋放一些磁碟空間。有一個很大的索引,我不確定它是否被使用。
select * from pg_stat_all_indexes where indexrelname = 'myindexname'; relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch -------+------------+------------+-----------------+-----------------------+----------+--------------+--------------- 20625 | 19563303 | public | mytablename | myindexname | 575598 | 281635 | 0 (1 row)
是否正在使用此索引?
idx_tup_fetch
是 0。這是否意味著它沒有被使用?我可以在不影響任何讀取/查詢的情況下刪除索引嗎?該數據庫正在生產中,在現實世界中使用。該索引最近被重建,從那以後一直在現實世界中使用。如果從那以後沒有使用過,就永遠不會使用。
索引大約130G,表50G。
該文件指出以下內容:
索引可以通過簡單的索引掃描或“點陣圖”索引掃描來使用。在點陣圖掃描中,可以通過 AND 或 OR 規則組合多個索引的輸出,因此在使用點陣圖掃描時很難將單個堆行提取與特定索引相關聯。因此,點陣圖掃描會增加
pg_stat_all_indexes.idx_tup_read
它使用的索引的計數,並增加pg_stat_all_tables.idx_tup_fetch
表的計數,但不會影響pg_stat_all_indexes.idx_tup_fetch
.**注意:**即使不使用點陣圖掃描,
idx_tup_read
andidx_tup_fetch
計數也可能不同,因為 idx_tup_read 計算從索引中檢索到的索引條目,而 idx_tup_fetch 計算從表中獲取的活動行。如果使用索引獲取任何死行或尚未送出的行,或者通過僅索引掃描避免任何堆獲取,則後者將更少。這為您提供了兩種可能性。您通過重建索引排除的第一個,因此可以猜測該索引是通過僅索引掃描和/或點陣圖索引掃描專門使用的。
EXPLAIN
您可以通過檢查可能使用此索引的查詢的輸出來確認此購買。您可以在depesz 的頁面上閱讀更多關於點陣圖掃描的資訊。