假設我有一張這樣的桌子:
create table mytable (
mycol text[]
)
我想選擇mycol包含的所有行"hello"。我可以想到兩種方法來做到這一點:
SELECT * FROM mytable WHERE 'hello'=any(mycol);
--or
SELECT * FROM mytable WHERE mycol && '{hello}';
我知道第二個選項我可以使用 GIN 索引(允許陣列選項),我很確定第一個我會使用 BTREE(或者可能是 HASH?)。
所以我的問題是:如果我只需要檢查單個專案的成員資格,對于具有數百萬行的表,哪種索引方法最有效?
uj5u.com熱心網友回復:
第二個,帶有 GIN 索引。
第一個不能以有效的方式使用 btree 或哈希索引。它可以使用 btree 索引,但只能作為表的精簡副本。
您可能會將此與相反的情況混淆,其中列在 ANY 之前(并且是一個標量),而文字在 ANY 之內。這個可以使用btree。
SELECT * FROM mytable_scalar WHERE mycol =any('{hello,goodbye}');
了解某事物的效率的一個好方法通常是使用虛假資料進行嘗試,但其大小卻模糊不清:
insert into mytable select ARRAY[md5(random()::text),md5(random()::text)] from generate_series(1,1500000);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447397.html
標籤:sql 数组 PostgreSQL 索引
