Postgresql

索引必須涵蓋要在合併中使用的所有列嗎?

  • September 9, 2021

出於測試目的,我有興趣加快以下查詢:

SELECT a.*, b.id 
FROM "table" a JOIN "table" b ON
a.id = b.id

where 上"table"有一個索引id。當通過這個時,postgres 嘗試對實例執行索引掃描b,但需要排序a。是否也可以在此查詢中使用索引a.id(或者由於類似於此處討論的原因,此查詢會從根本上變慢)。

PostgreSQL可以在這兩種情況下執行索引掃描,但它更喜歡在第一種情況下進行順序掃描和排序,因為它認為這樣會更快。在第二種情況下,僅索引掃描是可能的並且速度更快。

您當然可以將所有表列添加到索引中,但這通常是不合理的,甚至可能超出索引條目的大小限制。

如果您有理由相信 PostgreSQL 做錯了,您可以嘗試使用enable_seqscanset to查詢是否更快off。如果是,也許您必須進行調整random_page_cost以匹配您的硬體。

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