Postgresql
索引必須涵蓋要在合併中使用的所有列嗎?
出於測試目的,我有興趣加快以下查詢:
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_seqscan
set to查詢是否更快off
。如果是,也許您必須進行調整random_page_cost
以匹配您的硬體。