簡體   English   中英

where 和 order by 子句的多列索引(postgres)

[英]Multicolumn index for where and order by clause (postgres)

考慮這樣的查詢:

select ... from table where a = 1 and b > 2 order by c asc

這個查詢的理想索引是什么? 我應該使用一個索引(a,b,c)還是兩個單獨的(a,b)和(c)?

提前致謝。

你可能不能同時做好這兩件事。 相等不是問題,但你不能干凈地將不等與排序結合起來。 您希望返回多少行? 如果b>2非常有選擇性,只剩下幾行要排序,那么顯然你想要(a,b)因為獲得選擇性很有用,而對剩余的幾行進行排序不會花費很長時間。 另一方面,如果b>2僅排除幾行,則(a,c) (可能在末尾有更多列以允許僅索引掃描)在刪除失敗 b 的少數行時避免大的慢排序“艱難的道路”不需要很長時間。

您可以同時構建兩者並讓計划者進行調用,盡管這樣做遠非完美。

可以在所有三列上使用 GiST 索引來同時實現不等式過濾和排序,但 GiST 索引的開銷比 BTree 索引高得多,而且構建和維護速度較慢,因此不太可能值得一試,盡管如果您使用 LIMIT 可以使其更具吸引力。 您還需要以扭曲的方式編寫查詢,作為 KNN 查詢(由btree_gist擴展輔助):

where a = 1 and b > 2 order by c <-> impossibly_low_value

還有其他高級可能性。 如果您比較 b 的東西總是>2 ,那么您可以使用部分索引(a,c) where b>2或表達式索引(a,(b>2),c) 您也許還可以在 b 上進行有用的分區。 如果 b 有少量不同的值,您可以對每個合格的不同值的查詢結果進行 UNION 並使用(a,b,c)上的索引,獲得有效的合並 append:

(select * from foo where a=1 and b=3 order by c asc) 
    union all 
(select * from foo where a=1 and b=4 order by c asc) 
order by c asc;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM