簡體   English   中英

PostgreSQL - 查詢HSTORE值的GIN索引

[英]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.

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