2016-06-11 13 views
4

Hier ist ein Protokoll von dem, was ich laufe. Bei ausgeschaltetem Array läuft es in 56 ms. Ich aktivieren dann Intarray, und führen Sie die gleiche Abfrage, und es ist viel langsamer.Warum führt das Aktivieren der Intarray-Erweiterung in PostgresSQL zu einer 10-fachen Leistungsverschlechterung?

Muss ich die Tabelle oder etwas Ähnliches neu indizieren, nachdem ich die Erweiterung aktiviert habe?

test_int=# explain analyze select * from tutor_topic tt1 where tt1.topic_id @> '{5,7,8,9}'; 
                 QUERY PLAN              
----------------------------------------------------------------------------------------------------------------------- 
Seq Scan on tutor_topic tt1 (cost=0.00..29742.00 rows=1000 width=105) (actual time=24.903..1937.480 rows=68 loops=1) 
    Filter: (topic_id @> '{5,7,8,9}'::integer[]) 
    Rows Removed by Filter: 999932 
Planning time: 0.084 ms 
Execution time: 1937.521 ms 
(5 rows) 

Time: 1938.000 ms 
test_int=# DROP EXTENSION intarray;                                DROP EXTENSION 
Time: 10.516 ms 
test_int=# explain analyze select * from tutor_topic tt1 where tt1.topic_id @> '{5,7,8,9}'; 
                  QUERY PLAN                
---------------------------------------------------------------------------------------------------------------------------------- 
Bitmap Heap Scan on tutor_topic tt1 (cost=108.78..487.18 rows=100 width=105) (actual time=55.063..55.138 rows=68 loops=1) 
    Recheck Cond: (topic_id @> '{5,7,8,9}'::integer[]) 
    Heap Blocks: exact=68 
    -> Bitmap Index Scan on message_rdtree_idx (cost=0.00..108.75 rows=100 width=0) (actual time=55.047..55.047 rows=68 loops=1) 
     Index Cond: (topic_id @> '{5,7,8,9}'::integer[]) 
Planning time: 0.196 ms 
Execution time: 55.180 ms 
(7 rows) 

Time: 56.095 ms 
test_int=# 

Dies ist das Schema für die Tabelle tutorial_topic;

CREATE TABLE IF NOT EXISTS tutor_topic            
(                     
     tutor_id    INT NOT NULL,            
     topic_id    INT[]              
);   

Dies sind die Indizes:

ALTER TABLE tutor_topic ADD FOREIGN KEY (tutor_id) REFERENCES tutor(tutor_id);  
CREATE INDEX ON tutor_topic (tutor_id);            
CREATE INDEX message_rdtree_idx ON tutor_topic USING GIN (topic_id) 

Schema |   Name   | Type | Owner | Table  
--------+---------------------------+-------+--------+------------- 
public | message_rdtree_idx  | index | xxxxxx | tutor_topic 
public | topic_pkey    | index | xxxxxx | topic 
public | tutor_pkey    | index | xxxxxx | tutor 
public | tutor_topic_tutor_id_idx | index | xxxxxx | tutor_topic 
public | tutor_topic_tutor_id_idx1 | index | xxxxxx | tutor_topic 

Antwort

2

ich die Antwort herausgefunden!

Bei der Erstellung des Index muss ich die Funktion aus der Erweiterung angeben: CREATE INDEX message_rdtree_idx ON tutorial_topic VERWENDEN GIN (topic_id gin__int_ops);

Jetzt Leistung übereinstimmt. Aus dem Aufruf von explain analyze geht hervor, dass der Index überhaupt nicht verwendet wurde.

Verwandte Themen