我有很多疑問,例如
select * from table where (upper (column1) like 'FOO%')
and (upper (column2) like 'BAR%')
and (upper (column3) like 'XYZ%')
這樣一個索引:
create index on table (upper(column1::text), upper(column2::text), upper(column3::text));
但是由于某種原因查詢很慢,并且解釋運算子顯示它不使用任何索引掃描,只是簡單的秒掃描。我讀過 B 樹索引型別最適合像我這樣在常量末尾帶有錨點的查詢。任何想法為什么會發生這種情況?我的索引創建命令可能有問題嗎?
uj5u.com熱心網友回復:
為此,您需要三個索引:
/* "text_pattern_ops" makes the index usable for LIKE */
CREATE INDEX ON "table" (column1 text_pattern_ops);
CREATE INDEX ON "table" (column2 text_pattern_ops);
CREATE INDEX ON "table" (column3 text_pattern_ops);
PostgreSQL 將掃描一個或多個索引以查找WHERE承諾顯著減少行數的條件。如果它掃描多個索引,它可以組合結果。如果這些WHERE條件之一從不具有選擇性,則可以省略相應的索引,因為它不會被使用。
您將無法使用單個索引覆寫該查詢。
uj5u.com熱心網友回復:
那么在UPPER三列上使用該函式基本上排除了使用索引的任何機會。但是,如果可以確保僅在三列中存盤大寫值,則可以添加索引:
CREATE INDEX idx ON yourTable (column1, column2, column3);
然后,您將使用此版本的查詢:
SELECT *
FROM yourTable
WHERE column1 LIKE 'FOO%' AND column2 LIKE 'BAR%' AND column3 LIKE 'XYZ%';
此索引起作用的原因是您的LIKE運算式是從列值的最開頭開始的子字串。因此,可以使用 B 樹索引來搜索這些起始子串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313932.html
標籤:sql PostgreSQL
上一篇:有沒有辦法在Postgres中記錄相關ID(從微服務發送)
下一篇:如何將表中的行聚合為一個字串?
