![](/img/trans.png)
[英]PostgreSQL: sequential table scan on Hstore column despite having a GiN index
[英]PostgreSQL - query against GIN index of HSTORE value
我有以下構造函數(作為測試):
CREATE TABLE product (id BIGSERIAL PRIMARY KEY, ext hstore);
CREATE INDEX ix_product_ext ON product USING GIN(ext);
INSERT
INTO product (id, ext)
SELECT id, ('size=>' || CEILING(10 + RANDOM() * 90) || ',mass=>' || CEILING(10 + RANDOM() * 90))::hstore
FROM generate_series(1, 100000) id;
我有以下查詢,它可以正常工作:
SELECT COUNT(id)
FROM (
SELECT id
FROM product
WHERE (ext->'size')::INT >= 41
AND (ext->'mass')::INT <= 20
) T
但我相信正確的方法是使用@>運算符。 我有以下內容,但它給出了語法錯誤:
SELECT COUNT(id)
FROM (
SELECT id
FROM product
WHERE ext @> 'size>=41,mass<=20'
) T
我該怎么寫呢?
您的初始嘗試是正確的,但您需要使用(部分)btree索引和位圖索引掃描來依賴它:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
對於質量也一樣,如果規划者沒有在現場得到它,則添加兩個where子句,即where ext->'size' is not null
且質量相同。
如果存在某種模式(很可能,因為大多數具有大小的產品也具有質量),可能會創建一個多列索引,組合兩個 - 一個囊,另一個desc。
您編寫的gin索引以及隨附的查詢(帶有語法錯誤)基本上會執行相同的操作但無序; 它會慢一些。
讀取hstore文檔(最后查詢) size>=41
並不意味着“當大小大於或等於41時”:
text => text make single-pair hstore
之后你不能寫mass<=20
,因為沒有這樣的操作。 使用@>
運算符:
hstore @> hstore does left operand contain right?
你可以寫:
SELECT count(id)
FROM product
WHERE ext @> 'size=>41,mass=>20';
然而,只有這些產品的尺寸等於41,質量等於20。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.