Не знам дали Pg може да комбинира GiST индекс и обикновени b-tree индекси със сканиране на растерни индекси, но подозирам, че не. Може да получите най-добрия възможен резултат без добавяне на user_id
колона към вашия GiST индекс (и следователно го прави по-голям и по-бавен за други заявки, които не използват user_id
).
Като експеримент бихте могли:
CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);
което вероятно ще доведе до голям индекс, но може да засили тази заявка - ако работи. Имайте предвид, че поддържането на такъв индекс значително ще забави INSERT
и UPDATE
с. Ако изпуснете старите ix_coords
вашите заявки ще използват ix_coords_and_user_id
дори и да не филтрират по user_id
, но ще бъде по-бавен от ix_coords
. Запазването на двете ще направи INSERT
и UPDATE
забавяне още по-лошо.
Вижте btree-gist
(Остарял от редакция на въпрос, която напълно променя въпроса; когато е написан, потребителят е имал индекс с много колони, те сега са разделени на два отделни ):
Изглежда, че не филтрирате или сортирате по user_id
, само create_date
. Pg няма (не може?) да използва само втория член на индекс с няколко колони като (user_id, create_date)
, трябва да използва и първия елемент.
Ако искате да индексирате create_date
, създайте отделен индекс за него. Ако използвате и имате нужда от (user_id, create_date)
индекс и обикновено не използвайте само user_id
сам, вижте дали можете да обърнете реда на колоните. Алтернативно създайте два независими индекса, (user_id)
и (create_date)
. Когато са необходими и двете колони, Pg може да комбинира двата независими индекса с помощта на сканиране на растерни индекси.