Дистанция cube, как выбрать ближайшие чтобы из индекса?

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Дистанция cube, как выбрать ближайшие чтобы из индекса?
Date: 2014-10-05 07:33:34
Message-ID: 20141005073333.GA16147@vdsl.uvw.ru
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

Таблица "public.t"
Колонка | Тип | Модификаторы
---------+---------+------------------------------------------------
id | integer | NOT NULL DEFAULT nextval('t_id_seq'::regclass)
p | point |
Индексы:
"t_p_gist_idx" gist (p)

INSERT INTO "t"
SELECT
generate_series(1, 1000000) AS "id",
point(random(), random()) AS "p";

EXPLAIN ANALYZE
SELECT
"id", point(0.3, 0.3) <-> p
FROM
"t"
ORDER BY
point(0.3, 0.3) <-> p
LIMIT 10;

Limit (cost=0.29..1.10 rows=10 width=20) (actual time=0.248..0.276 rows=10 loops=1)
-> Index Scan using t_p_gist_idx on t (cost=0.29..81860.29 rows=1000000 width=20) (actual time=0.246..0.269 rows=10 loops=1)
Order By: (p <-> '(0.3,0.3)'::point)
Total runtime: 0.320 ms
(4 строки)

Для точек - прям то что надо, работает чистый index scan и лимит.

Продолжаем эксперимент:

ALTER TABLE "t"
ADD COLUMN "c" cube NOT NULL
DEFAULT cube(ARRAY[random(), random(), random(), random()]);

CREATE INDEX "t_c_gist_idx" ON "t" USING GIST ("c");

Далее выбираем ближайшие кубы по аналогии с точками

EXPLAIN ANALYZE
SELECT
"id", cube_distance("c", cube(ARRAY[0.3,0.3,0.3,0.3])) AS "dist"
FROM
"t"
ORDER BY
cube_distance("c", cube(ARRAY[0.3,0.3,0.3,0.3]))
LIMIT 10;

Limit (cost=49494.64..49494.67 rows=10 width=36) (actual time=791.093..791.098 rows=10 loops=1)
-> Sort (cost=49494.64..51994.64 rows=1000000 width=36) (actual time=791.090..791.092 rows=10 loops=1)
Sort Key: (cube_distance(c, '(0.3, 0.3, 0.3, 0.3)'::cube))
Sort Method: top-N heapsort Memory: 25kB
-> Seq Scan on t (cost=0.00..27885.00 rows=1000000 width=36) (actual time=0.041..507.259 rows=1000000 loops=1)
Total runtime: 791.137 ms
(6 строк)

То есть видно что в случае с точками выборка ближайших соседей -
выборка нескольких элементов из индекса.

в случае с кубом - это еще и сортировка всей таблицы из миллиона
элементов.

соответственно для точек получается 0.3мс, для кубов 791 мс.

я так полагаю что cube не определяет дистанцию для индекса, либо я
как-то не включил ее использование.

Вопрос: как привести EXPLAIN по cube к такому же виду как по point?

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Oleg Bartunov 2014-10-05 11:04:32 Re: [pgsql-ru-general] Дистанция cube, как выбрать ближайшие чтобы из индекса?
Previous Message Dmitry E. Oboukhov 2014-09-29 20:19:39 Re: GIN индекс: сортировка