Postgresql

是否正在使用我的 postgres 索引?

  • October 15, 2015

我有一個用於生產的大型 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_readandidx_tup_fetch計數也可能不同,因為 idx_tup_read 計算從索引中檢索到的索引條目,而 idx_tup_fetch 計算從表中獲取的活動行。如果使用索引獲取任何死行或尚未送出的行,或者通過僅索引掃描避免任何堆獲取,則後者將更少。

這為您提供了兩種可能性。您通過重建索引排除的第一個,因此可以猜測該索引是通過僅索引掃描和/或點陣圖索引掃描專門使用的。EXPLAIN您可以通過檢查可能使用此索引的查詢的輸出來確認此購買。

您可以在depesz 的頁面上閱讀更多關於點陣圖掃描的資訊。

引用自:https://dba.stackexchange.com/questions/118116