geebv
@geebv

Почему не используется Index Only Scan?

Вопрос
Почему в запросе (Смотри в конце план запроса и сам запрос) не используется Index Only Scan?

SELECT version();
-[ RECORD 1 ]-------------------------------------------------------------------------------------
version | PostgreSQL 9.5.4 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit


Структура таблиц
\d oli_products;
                      Table "public.oli_products"
    Column    |           Type           |          Modifiers
--------------+--------------------------+------------------------------
 oli_id       | uuid                     | not null
 order_id     | uuid                     | not null
 product_id   | uuid                     | not null
 product_data | jsonb                    | not null default '{}'::jsonb
 list_price   | bigint                   | not null
 sell_price   | bigint                   | not null
 count        | integer                  | not null
 status       | text                     | not null
 status_code  | text                     |
 updated_at   | timestamp with time zone | not null default now()
 created_at   | timestamp with time zone | not null
Indexes:
    "oli_products_pkey" PRIMARY KEY, btree (oli_id)
    "olip_oid_idx" btree (order_id, oli_id, status)
Check constraints:
    "oli_products_list_price_check" CHECK (list_price >= 0)
    "oli_products_sell_price_check" CHECK (sell_price >= 0)

\d oli_productschecks;
                Table "public.oli_productschecks"
   Column    |           Type           |       Modifiers
-------------+--------------------------+------------------------
 oli_id      | uuid                     | not null
 order_id    | uuid                     | not null
 provider_id | uuid                     | not null
 task_id     | uuid                     |
 list_price  | bigint                   | not null
 sell_price  | bigint                   | not null
 count       | integer                  | not null
 status      | text                     | not null
 status_code | text                     |
 updated_at  | timestamp with time zone | not null default now()
 created_at  | timestamp with time zone | not null
Indexes:
    "oli_productschecks_pkey" PRIMARY KEY, btree (oli_id)
    "olipc_oid_idx" btree (order_id, oli_id, status)
Check constraints:
    "oli_productschecks_list_price_check" CHECK (list_price >= 0)
    "oli_productschecks_sell_price_check" CHECK (sell_price >= 0)


SQL запрос
SELECT order_id, oli_id, status, count(status) FROM (
		SELECT order_id, oli_id, status FROM oli_products
		WHERE order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e' 

		UNION ALL 
		
		SELECT order_id, oli_id, status FROM oli_productschecks
		WHERE order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e'
		) as order_line_items
		
	GROUP BY order_id, oli_id, status


Предварительно заставляю использовать индекс
SET enable_seqscan TO off;

План запроса
< status FROM oli_productschecks^JWHERE order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e'^J) as order_line_items^JGROUP BY order_id, oli_id, status;
-[ RECORD 1 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | HashAggregate  (cost=14.56..14.63 rows=7 width=41) (actual time=0.034..0.036 rows=5 loops=1)
-[ RECORD 2 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   Group Key: oli_products.order_id, oli_products.oli_id, oli_products.status
-[ RECORD 3 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   ->  Append  (cost=4.19..14.49 rows=7 width=41) (actual time=0.018..0.024 rows=7 loops=1)
-[ RECORD 4 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |         ->  Bitmap Heap Scan on oli_products  (cost=4.19..6.26 rows=6 width=37) (actual time=0.018..0.020 rows=5 loops=1)
-[ RECORD 5 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |               Recheck Cond: (order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e'::uuid)
-[ RECORD 6 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |               Heap Blocks: exact=1
-[ RECORD 7 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |               ->  Bitmap Index Scan on olip_oid_idx  (cost=0.00..4.19 rows=6 width=0) (actual time=0.012..0.012 rows=5 loops=1)
-[ RECORD 8 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |                     Index Cond: (order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e'::uuid)
-[ RECORD 9 ]--------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |         ->  Index Only Scan using olipc_oid_idx on oli_productschecks  (cost=0.14..8.15 rows=1 width=64) (actual time=0.004..0.004 rows=2 loops=1)
-[ RECORD 10 ]-------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |               Index Cond: (order_id = '28148411-78cf-4368-b7d9-c65d9d7ffd8e'::uuid)
-[ RECORD 11 ]-------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |               Heap Fetches: 2
-[ RECORD 12 ]-------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Planning time: 5.174 ms
-[ RECORD 13 ]-------------------------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Execution time: 0.469 ms
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
BuriK666
@BuriK666
Компьютерный псих
https://wiki.postgresql.org/wiki/Index-only_scans

Попробуйте сделать VACUUM ANALYZE
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы