PostgreSql не использует индекс при присоединении - PullRequest
1 голос
/ 16 января 2020

Допустим, у нас есть следующие 2 таблицы:

purchases
-> id
-> classic_id(indexed TEXT)
-> other columns

purchase_items_2(a temporary table)
-> id
-> order_id(indexed TEXT)
-> other columns  

Я хочу сделать SQL соединение между двумя таблицами, например, так:

Select pi.id, pi.order_id, p.id
from purchase_items_2 pi
INNER JOIN purchases p ON pi.order_id = p.classic.id

Эта вещь должна использовать индексов нет? Это не так.

Любая подсказка, почему?

Это объяснение запроса

INNER JOIN purchases ON #{@table_name}.order_id = purchases.classic_id")
                                   QUERY PLAN
---------------------------------------------------------------------------------
Hash Join  (cost=433.80..744.69 rows=5848 width=216)
   Hash Cond: ((purchase_items_2.order_id)::text = (purchases.classic_id)::text)
   ->  Seq Scan on purchase_items_2  (cost=0.00..230.48 rows=5848 width=208)
   ->  Hash (cost=282.80..282.80 rows=12080 width=16)
         ->  Seq Scan on purchases  (cost=0.00..282.80 rows=12080 width=16)
(5 rows)

Когда я делаю запрос where

Select pi.id
from purchase_items_2 pi
where pi.order_id = 'gigel'

Используется индекс

                                            QUERY PLAN
--------------------------------------------------------------------------------------------------
Bitmap Heap Scan on purchase_items_2  (cost=4.51..80.78 rows=29 width=208)
   Recheck Cond: ((order_id)::text = 'gigel'::text)
   ->  Bitmap Index Scan on index_purchase_items_2_on_order_id  (cost=0.00..4.50 rows=29 width=0)
       Index Cond: ((order_id)::text = 'gigel'::text)\n(4 rows)

1 Ответ

2 голосов
/ 16 января 2020

Поскольку у вас нет условия WHERE, запрос все равно должен прочитать все строки обеих таблиц. А поскольку таблица ha sh, созданная объединением ha sh, подходит для work_mem, объединение ha sh (которое должно выполнять последовательное сканирование обеих таблиц) является наиболее эффективным стратегия соединения.

PostgreSQL не использует индексы, потому что в этом конкретном c запросе они работают быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...