Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Index для UUID


Автор: polin11 21.8.2021, 18:23
Использую Postresql.
Есть таблица Documents с полями:
Account тип bigint 
Document тип bigint
User тип UUID

Есть 2 индекса
Код

CREATE INDEX "AccountDocument" ON "Documents" USING btree ("Account" NULLS LAST, "Document" NULLS LAST)
WHERE ("Account" IS NOT NULL OR "Document" IS NOT NULL);

    
Код

CREATE INDEX "AccountUserDocument" ON "Documents"  USING btree ("Account", "User", "Document")


Для простого запроса хочу, чтобы использовался индекс AccountUserDocument

Код

SELECT *
FROM "Documents"
WHERE "Account" = 1
AND "USER" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::UUID 
AND "Document" = 2


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

Код

"Index Scan using "AccountDocument" on "Documents"  (cost=0.29..8.31 rows=1 width=73) (actual time=0.016..0.016 rows=0 loops=1)"
"  Index Cond: ("Document" = 2)"
"  Filter: (("Account" = 1) AND ("USER" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::uuid))"
"  Buffers: shared hit=2"
"Planning time: 1.026 ms"
"Execution time: 0.039 ms"


только есть указать у индекса AccountUserDocument тип индекса gist, то он используется 

Код

"Index Scan using "AccoutUserDocument" on "Documents"  (cost=0.28..8.30 rows=1 width=73) (actual time=3.626..3.626 rows=0 loops=1)"
"  Index Cond: (("User" = 'dd758b54-55b3-442a-804b-8a3d311432ba'::uuid) AND ("Document" = 2))"
"  Filter: ("Account" = 1)"
"  Buffers: shared hit=73"
"Planning time: 0.946 ms"
"Execution time: 3.652 ms"


Почитал инфу про тип gist он обычно используется для полнотекстового поиска.

Вопрос почему индекс не используется с типом btree, только из-за того, что в индексе есть поле UUID?


Автор: Akina 21.8.2021, 21:46
Ну так вроде очевидно, что поиск по двум бигинтам эффективнее, чем когда между ними ещё и бинари-16. Хотя бы потому, что гораздо компактнее.
Вот если бы не было звезды, если бы второй индекс был покрывающим...

Автор: _zorn_ 28.8.2021, 16:41
Одна (не) очевидная вещь - в запросе может использоваться только один индекс. И выбирается "лучший".
Сам почему то думал что если индексов навешать побольше, база "разберется" )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)