При поиске в Google для соедините таблицы с индексами, я получил this question.Индексы на таблицах объединений
Теперь я считаю, что он дает ложную информацию в принятом ответе, или я не понимаю, как все работает. Учитывая следующие таблицы (бег на PostGreSQL 9.4):
CREATE TABLE "albums" ("album_id" serial PRIMARY KEY, "album_name" text)
CREATE TABLE "artists" ("artist_id" serial PRIMARY KEY, "artist_name" text)
CREATE TABLE "albums_artists" ("album_id" integer REFERENCES "albums", "artist_id" integer REFERENCES "artists")
Я пытался повторить сценарий из вопроса, упомянутого выше, путем создания первого индекса на обоих столбцов albums_artists таблицы, а затем один индекс для каждого столбца (без сохранения индекса на обоих столбцах).
я бы ожидал очень разные результаты при использовании команды EXPLAIN для нормальной, традиционной выбрать, как следующему:
SELECT "artists".* FROM "test"."artists"
INNER JOIN "test"."albums_artists" ON ("albums_artists"."artist_id" = "artists"."artist_id")
WHERE ("albums_artists"."album_id" = 1)
Однако, когда на самом деле работает объяснить на нем, я получаю точно такой же результат для каждого из случаев (с одним индексом по каждому столбцу по сравнению с одним индексом на обоих столбцах).
Я читал документацию по PostGreSQL об индексации, и это не имеет никакого смысла на результаты, которые я получаю:
Hash Join (cost=15.05..42.07 rows=11 width=36) (actual time=0.024..0.025 rows=1 loops=1)
Hash Cond: (artists.artist_id = albums_artists.artist_id)
-> Seq Scan on artists (cost=0.00..22.30 rows=1230 width=36) (actual time=0.006..0.006 rows=1 loops=1)
-> Hash (cost=14.91..14.91 rows=11 width=4) (actual time=0.009..0.009 rows=1 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 1kB
-> Bitmap Heap Scan on albums_artists (cost=4.24..14.91 rows=11 width=4) (actual time=0.008..0.009 rows=1 loops=1)
Recheck Cond: (album_id = 1)
Heap Blocks: exact=1
-> Bitmap Index Scan on albums_artists_album_id_index (cost=0.00..4.24 rows=11 width=0) (actual time=0.005..0.005 rows=1 loops=1)
Index Cond: (album_id = 1)
Я бы ожидать, чтобы не получить сканирования индекса на последний шаг при использовании индекса, составленного из двух разных столбцов (поскольку я использую только один из них в предложении WHERE).
Я собирался открыть ошибку в библиотеке ORM, которая добавляет один индекс для обоих столбцов для таблиц объединения, но теперь я не уверен. Может ли кто-нибудь помочь мне понять, почему поведение аналогично в двух случаях и что на самом деле будет иметь значение, если они есть?
Этот вопрос по своей сути специфичен для СУБД. Вам нужно пометить его соответствующей СУБД. –
Спасибо за совет. Я добавил тег. –