«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
1. Многомерные индексы в
СУБД с открытым кодом
Андрей Бородин
Инженер компании Октоника
к.т.н., доцент РтФ УрФУ
2. Задачи многомерного индекса
Поиск
select *
from table
where table.point
is inside some region
Агрегация
select aggregate(column)
from table
where table.point
is inside some region
kNN (k Nearest Neighbor)
select *
from table
order by distance from some point
limit N
24. MySQL: kNN (нет)
SELECT id, name, X(geoPoint) AS "latitude", Y(geoPoint) AS "longitude",
( GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(51.5177 -0.0968)')
)
)
) )
AS distance
FROM geoTable
ORDER BY distance ASC;
25. MySQL: kNN (нет)
SELECT *, GLENGTH(LINESTRINGFROMWKB(LINESTRING(ASBINARY(POINTFROMTEXT("POINT(40.4495 -79.988)")),ASBINARY(pt)))) AS `distance`
FROM `ip_group_city` WHERE
MBRWithin(
pt, -- your point
GeomFromText('Polygon( -- Описание области префильтра для kNN
(
#{bound.ne.lat} #{bound.ne.lng}, --North East Lat - North East Long
#{bound.ne.lat} #{bound.sw.lng}, --North East Lat - South West Long
)
)') )
ORDER BY distance LIMIT 100
33. Теоретически оптимальный фактор
ветвления
В дереве с фактором ветвления f, запрос возвращающий ровно 1
кортеж должен рассмотреть ровно f ключей на каждом уровне
дерева.
K = f ∙ h = [f ∙ logfN],
К минимально при f e ≈ 3.
Без потери общности это верно и для количества затронутых кэш-линий.
• Реальный f ≈ 102
34. Оценка сверху ускорения от
внтристраничного индексирования
• На странице с n ≈ 243 кортежей оптимальное дерево с f = 3
сконструирует дерево с 4 уровнями.
• Поиск с результатом в 1 запись потребует 15 операций с ключами
вместо 243 (на каждой странице)
• Ожидаемая высота дерева будет на 57% больше изза
сокращённой в 1.5 раза вместимости страницы
• Поиск одной строки должен ускориться в 243/15/1.57 = 10 раз
• Но на практике на данный момент мне удалось достичь только
10%, из-за не полной реализации.
35. До Postgres 10 update вызывал изменение
порядка кортежей
• Before update
• After update of T3
38. Fractal tree for GiST
1M вставок – обычный GiST на 8% быстрее
3M - паритет
30M – GiST с отложенной вставкой на 12% быстрее
Тесты делались для SSD.
Больше информации и патч
45. Cube extension GiST penalty function
improvement
• https://commitfest.postgresql.org/10/782/
“Returned with feedback”
46. Revised R*-tree
• Split algorithm (с небольшими отличиями):
Реализация на GitHub
Ускорение до 50% на SELECTs расширения cube с небольшой
результирующей выборкой
• Choose subtree algorithm:
В существующем GiST API невозможен
Norbert Beckman: “Overlap optimization is one of the main elements, if not the
main query performance tuning element of the RR*-tree. You would fall back to old
R-Tree times if that would be left off.”
47. GiST API: функция соотношения ключей
• Сейчас функция consistent возвращает один из двух результатов:
1. Возможно ключи пересекаются (поддерево индекса может
содержать данные, соответствующие запросу)
2. Ключи не пересекаются
• Можно дополнить третьим состоянием: все данные поддерева
удовлетворяют условию поиска.
49. GiST API advancement
1. Allow choose subtree not via penalty calculation
2. Extend consistency API
50. GiST API advancement
1. Allow choose subtree not via penalty calculation
2. Extend consistency API
Any students here?
51. GiST API advancement
1. Allow choose subtree not via penalty calculation
2. Extend consistency API
Приём заявок на GSoC 2017 завершён
Но этим можно заняться в 2018
Больше про GSoC проекты PostgreSQL
52. Высокая размерность
более 10 групп измерений без корреляции между группами
+
Менее 1 000 000 000 операций с ключом на один поиск
=
Go Full Scan
FLANN сделает также
53. Высокая размерность: approximate kNN
• Non-Orthogonal Inverted Multi-Index
NO-IMI
• Fast Library for Approximate Nearest Neighbors
FLANN
Идеи по aNN в PostgreSQL есть, но они противоречат концепции
СУБД: результат не зависит от наличия индексов.