On Fri, May 20, 2022 at 6:42 AM Mickael van der Beek <
mickael.van.der.b...@gmail.com> wrote:

>
> Query:
>
> EXPLAIN (
>>   ANALYZE,
>>   VERBOSE,
>>   COSTS,
>>   BUFFERS,
>>   TIMING
>> )
>> SELECT
>>   fu.w2_page_idxs
>> FROM
>>   fact_users
>>     AS fu
>> WHERE
>>   EXISTS (
>>     SELECT
>>     FROM
>>       (
>>         SELECT
>>           ARRAY[idx] AS page_idx
>>         FROM
>>           fact_pages
>>         WHERE
>>           attribute_idxs && ARRAY[300000160]
>>         FETCH FIRST 1 ROWS ONLY
>>       )
>>         AS fp
>>     WHERE
>>       fu.w2_page_idxs && fp.page_idx
>>   )
>> ;
>
>
> Without any surprises, the planner is using a sequential scan on the
> "fact_users" table which is very large instead of using the GIN index set
> on the "w2_page_idxs" column.
>

For me, using the subquery in and expression, instead of the EXISTS, does
get it to use the gin index.  And I think it must give the same results.

SELECT
  fu.w2_page_idxs
FROM  fact_users AS fu
WHERE
      fu.w2_page_idxs && ARRAY[(select idx from fact_pages where
attribute_idxs && ARRAY[3003] FETCH FIRST 1 ROWS ONLY)];

But why are you using intarray?  That is unnecessary here, and by creating
ambiguity about the array operators it might be harmful.

Cheers,

Jeff

>

Reply via email to