亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PostgreSQL索引數組列可以嗎?

PostgreSQL索引數組列可以嗎?

阿晨1998 2019-08-02 07:02:53
PostgreSQL索引數組列可以嗎?我在文件中找不到這個問題的確切答案。如果列是數組類型,那么所有輸入的值都會被單獨索引嗎?我創建了一個簡單的表int[]列,并在其上添加唯一的索引。我注意到我無法添加相同的INT數組,這使我相信索引是數組項的組合,而不是每個項的索引。INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");索引對此查詢有幫助嗎
查看完整描述

3 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊


是的,可以索引數組,但必須使用數組運算符GIN索引類型.

例子:

    CREATE TABLE "Test"("Column1" int[]);
    INSERT INTO "Test" VALUES ('{10, 15, 20}');
    INSERT INTO "Test" VALUES ('{10, 20, 30}');

    CREATE INDEX idx_test on "Test" USING GIN ("Column1");

    -- To enforce index usage because we have only 2 records for this test... 
    SET enable_seqscan TO off;

    EXPLAIN ANALYZE    SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];

結果:

Bitmap Heap Scan on "Test"  (cost=4.26..8.27 rows=1 width=32) (actual time=0.014..0.015 rows=2 loops=1)
  Recheck Cond: ("Column1" @> '{20}'::integer[])
  ->  Bitmap Index Scan on idx_test  (cost=0.00..4.26 rows=1 width=0) (actual time=0.009..0.009 rows=2 loops=1)
        Index Cond: ("Column1" @> '{20}'::integer[])Total runtime: 0.062 ms

似乎在許多情況下杜松子酒需要選擇

create index <index_name> on <table_name> using GIN (<column> gin__int_ops)

我還沒有見過在不使用gin_INT_OPS選項的情況下與&and@>操作符一起工作的情況。




查看完整回答
反對 回復 2019-08-03
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

要用數組運算符,也就是仍然正確給Postgres 11號。手冊:

..PostgreSQL的標準發行版包括一個用于數組的GIN運算符類,它支持使用以下操作符進行索引查詢:

<@@>=&&

標準發行版中GIN索引的內置操作符類的完整列表在這里。

在Postgres索引綁定到運算符。(它是為某些類型實現的),而不是單獨的數據類型或函數或其他任何東西。那是從最初的伯克利設計中繼承的Postgres現在很難改變。一般情況下都很好。下面是pgsql-bug上的一個線程,TomLane對此進行了評論。

一些PostGis功能(比如ST_DWithin())似乎違反了這個原則,但事實并非如此。這些函數在內部重寫以使用各自的操作者.

索引表達式必須位于左邊接線員。對于大多數運營商(包括上述所有)如果將索引表達式放置在右側,則查詢計劃器可以通過翻轉操作數來實現這一點。COMMUTATOR已經被定義了。這個ANY構造可以與各種操作符結合使用,而不是操作符本身。當用作constant = ANY (array_expression)只支持=操作員開啟陣列元件我們需要一個交換器= ANY()..杜松子酒指數出來了。

Postgres目前還不夠聰明,無法從它派生出一個GIN-索引表達式。首先,constant = ANY (array_expression)不完全等價array_expression @> ARRAY[constant]..數組運算符返回錯誤(如果任何NULL)。元素參與其中,而ANY構造可以在任何一方處理NULL。對于數據類型的不匹配,有不同的結果。

有關答復:

旁白

在工作中integer陣列 (int4,不是int2int8)沒有NULL值(如示例所示)考慮附加模塊intarray,這提供了專門的、更快的操作符和索引支持。見:

至于UNIQUE問題中未回答的約束:該約束是用btree索引實現的。全陣值(就像您所懷疑的那樣),并且無助于搜索元素完全沒有。詳情:




查看完整回答
反對 回復 2019-08-03
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

現在可以對單個數組元素進行索引。例如:


CREATE TABLE test (foo int[]);

INSERT INTO test VALUES ('{1,2,3}');

INSERT INTO test VALUES ('{4,5,6}');

CREATE INDEX test_index on test ((foo[1]));

SET enable_seqscan TO off;


EXPLAIN ANALYZE SELECT * from test WHERE foo[1]=1;

                                                QUERY PLAN                                                    

------------------------------------------------------------------------------------------------------------------

 Index Scan using test_index on test  (cost=0.00..8.27 rows=1 width=32) (actual   time=0.070..0.071 rows=1 loops=1)

   Index Cond: (foo[1] = 1)

 Total runtime: 0.112 ms

(3 rows)

這至少適用于Postgres 9.2.1。注意,您需要為每個數組索引構建一個單獨的索引,在我的示例中,我只對第一個元素進行了索引。



查看完整回答
反對 回復 2019-08-03
  • 3 回答
  • 0 關注
  • 601 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號