powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажи по оптимизации индексирования при построении квадродерева
21 сообщений из 21, страница 1 из 1
Подскажи по оптимизации индексирования при построении квадродерева
    #39050720
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Я хочу сформировать что-то на подобии квадродерева для кластеризации точек геоданных. То есть я разбиваю карту сначало 30х30, а дальше каждый квадрат на 4 и так еще 18 уровней. При записи новой точки (кол-во запросов чтения, конечно больше чем добавления и изменения, но я считаю что примерно одинаково) ей присваиваются все уровни. Таким образом операция выборки проходит довольно легко.

Я реализовал хранение каждого уровня в отдельном поле (small integer). Таким образом у меня 19 полей: L1x, L1y, L2, L3, ...
Я полагаю, что таким образом будет обеспечено лучшее индексирование, чем если бы я хранил одно поле тип : 18190101111...
Я думаю, что одно поле будет индексироваться не совсем правильно, к тому же мне надо делать выборки по определенному уровню, а если у меня будет одно поле, то запрос LIKE будет тормозить всю операцию..

У меня есть два вопроса:

1. Правильно ли я поступил? Либо есть способы лучше, возможно есть более подходящий тип данных для меня.
2. Есть опреация CLUSTER. Но эта операция работает только на один идекс для таблицы. Есть ли способ кластеризовать сразу несколько индексов одной таблицы? Либо есть другие способы?
3. Возможно можно подключить SP-GIST индексы для данной сетуации, но я не очень понимаю как дальше работать с ними..
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39050764
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для L1x и L1y значения идет в пределах от 0 до 29
А для остальных полей L значения могут быть только такие: 0, 1, 10, 11

Я построил индексы для всех полей. Возможно это я зря сделал для полей кроме L1x и L1y
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39050777
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closius,

запросы то покажите
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39050867
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin:

С этим сложнее. Работаю через ORM Django.

Запрос на получение маркеров (точек) и уникальных квадратов кластеров такой:

# Получаем маркеры, которые входят в запрашиваемый бокс.
# Исключаем все маркеры, владельцы которых заблокированы, не активны или помечены флагом удален
markers = Marker.objects.filter(point__contained=q_box).filter(owner__is_active=True).filter(owner__is_blocked=False).filter(owner__is_deleted=False)
# Исключаем все маркеры, владельцы которых добавили запрашевающего юзера в черный список
markers = markers.exclude(owner__blocked_users=user)
# Фильтрация
# Возраст запрашивающего юзера
users_age = calculate_age(user.date_of_birth)
markers = markers.filter(Q(max_age__gte=users_age) | Q(max_age=None)).filter(Q(min_age__lte=users_age) | Q(min_age=None))
markers = markers.filter(Q(allowed_gender=user.gender) | Q(allowed_gender=2))
# Прекция из БД по уровню
# Получаем список уровней, которые есть в кверисете маркеров
if level =='markers_only':
pass
elif level == 3:
unic_zones = markers.distinct('L1y','L1x')
else:
# Надо прощитывать все уровни. Иначе два маркера где например
# L11=11 но при этом другие уровни не равны, проекция будет взята по одному
i = 4
q = ['L1y', 'L1x']
while i <= level:
q.append( 'L' + str(i) )
i = i + 1
unic_zones = markers.distinct(*q)
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39053431
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closius,
это не запросы, нужны структура данных и запросы.

все или торт, который тормозит.
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39053622
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли отловить запросы которые поступают в БД? Какие есть вредства?
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39053830
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closius,

SELECT * FROM pg_stat_activity ну и собсно, лог файлы...
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39053831
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClosiusДобрый день.

Я хочу сформировать что-то на подобии квадродерева для кластеризации точек геоданных. То есть я разбиваю карту сначало 30х30, а дальше каждый квадрат на 4 и так еще 18 уровней. При записи новой точки (кол-во запросов чтения, конечно больше чем добавления и изменения, но я считаю что примерно одинаково) ей присваиваются все уровни. Таким образом операция выборки проходит довольно легко.

Я реализовал хранение каждого уровня в отдельном поле (small integer). Таким образом у меня 19 полей: L1x, L1y, L2, L3, ...
Я полагаю, что таким образом будет обеспечено лучшее индексирование, чем если бы я хранил одно поле тип : 18190101111...
Я думаю, что одно поле будет индексироваться не совсем правильно, к тому же мне надо делать выборки по определенному уровню, а если у меня будет одно поле, то запрос LIKE будет тормозить всю операцию..

У меня есть два вопроса:

1. Правильно ли я поступил? Либо есть способы лучше, возможно есть более подходящий тип данных для меня.
2. Есть опреация CLUSTER. Но эта операция работает только на один идекс для таблицы. Есть ли способ кластеризовать сразу несколько индексов одной таблицы? Либо есть другие способы?
3. Возможно можно подключить SP-GIST индексы для данной сетуации, но я не очень понимаю как дальше работать с ними..
а у вас там сейчас 19 индексов??????
Это жесть.
Как вы ищите? Есть ли поиск по нижним уровням БЕЗ верхних?
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39054360
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durakа у вас там сейчас 19 индексов??????
Это жесть.
Как вы ищите? Есть ли поиск по нижним уровням БЕЗ верхних?

Тоже думаю что жесть.. Там один составной индекс и остальные обычные. Вот и думаю может объединить все уровни в одно поле.. Но как тогда потом производить поиск, не будет ли он долгим?

Алгоритм такой:

1. Получаю все маркеры в заданной области клиента
1а. Вычисляю уровень зуммирования при данной областим запроса.
2. Фильтрую по разным фильтрам, которые пришли в запросе от клиента.
3. Делаю distinct по всем полям уровня до рассчитанного уровня зуммирования.
4. (а вот тут хренова) Делаю цикл по всем полученным уникальным уровням после distinct'a.
По каждому уровню делаю запрос на получение колличества всех маркеров (из отфильтрованных) по данному уровню.

Таким образом получается список кластер - кол-во маркеров в кластере. Ну там еще вычисляется координата центра кластера, но это без участия бд, чисто математически по обозначению уровня.
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39054361
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan DurakЕсть ли поиск по нижним уровням БЕЗ верхних?

Нет. В поиске участвует всегда от верхнего уровня до какого-либо. Отдельно по нижним нет.
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39054568
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClosiusIvan DurakЕсть ли поиск по нижним уровням БЕЗ верхних?

Нет. В поиске участвует всегда от верхнего уровня до какого-либо. Отдельно по нижним нет.
тогда вообще-то будет работать и одно составное поле, Like '12334%' использует поиск по индексу!!
И в принципе так же будет работать составной индекс с правильным порядком полей, от вернего к нижним!
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39054612
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closius,
в некоторых базах есть встроенные средства индексирования для поддержки таких запросов
например в SQLite есть определённые флаги компиляции которые позволяют добавить поддерживание двумерных индексов для выборок вида (x1<x<x2)and(y1<y<y2) (вроде через регионы реализованы)
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055507
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan DurakClosiusпропущено...


Нет. В поиске участвует всегда от верхнего уровня до какого-либо. Отдельно по нижним нет.
тогда вообще-то будет работать и одно составное поле, Like '12334%' использует поиск по индексу!!
И в принципе так же будет работать составной индекс с правильным порядком полей, от вернего к нижним!

Составной индекс сделать не получится.. Если только не делать несколько составных индексов типа (L1, L2) (L1,L2,L3) (L1,L2,L3,L4) и тд Но это тоже много индексов..

Я вот думаю стоит ли вообще инексировать нижние уровни, которые могут иметь только 4 значения?
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055510
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Closius,
в некоторых базах есть встроенные средства индексирования для поддержки таких запросов
например в SQLite есть определённые флаги компиляции которые позволяют добавить поддерживание двумерных индексов для выборок вида (x1<x<x2)and(y1<y<y2) (вроде через регионы реализованы)

Не очень понял как это мне поможет.
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055537
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClosiusIvan Durakпропущено...

тогда вообще-то будет работать и одно составное поле, Like '12334%' использует поиск по индексу!!
И в принципе так же будет работать составной индекс с правильным порядком полей, от вернего к нижним!

Составной индекс сделать не получится.. Если только не делать несколько составных индексов типа (L1, L2) (L1,L2,L3) (L1,L2,L3,L4) и тд Но это тоже много индексов..

Я вот думаю стоит ли вообще инексировать нижние уровни, которые могут иметь только 4 значения?
не нужно много составных индексов!!
Имея индекс (L1,L2,L3,L4) поиск по полям L1 и L2 будет осуществляться по этому индексу!!!!! Так же как и по полю L1 или по полям L1,L2,L3 !! Главное чтобы не было поиска по нижним уровням без верхних
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055585
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LonepsychoClosius,

SELECT * FROM pg_stat_activity ну и собсно, лог файлы...

Что-то он выводит постоянно только эти строки:

"SELECT setting FROM pg_settings WHERE name IN ('autovacuum', 'track_counts')"
"SELECT c.oid, c.relname , nspname
FROM pg_inherits i
JOIN pg_class c ON c.oid = i.inhparent
JOIN pg_namespace n ON n.oid=c.relnamespace
WHERE i.inhrelid = 18577::oid
ORDER BY inhseqno"
"SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations""
"SELECT * FROM pg_stat_activity;"

Может есть средство как в реальном времени смотреть запросы? Ну с обновлением раз в 10 секунд например

Или может у меня логи не ведутся??
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055600
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ClosiusIvan Durakпропущено...

тогда вообще-то будет работать и одно составное поле, Like '12334%' использует поиск по индексу!!
И в принципе так же будет работать составной индекс с правильным порядком полей, от вернего к нижним!

Составной индекс сделать не получится.. Если только не делать несколько составных индексов типа (L1, L2) (L1,L2,L3) (L1,L2,L3,L4) и тд Но это тоже много индексов..


Немного не так хотел сказать. Да надо делать составные все. Сделал сейчас вместо отдельных индексов все составные. Вроде производительность увеличилась.. Но всеравно в таблице 22 индекса... незнаю на сколько это плохо.

А вот что быстрее: составной индекс по например 5 полям или дублирование данных (от нижнего до текущего индекса прям в этом поле хранить) в каждом поле и делать индексы отдельно по полю?
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39055701
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closius,

log_min_duration = 0 в postgresql.conf если не ошибаюсь, будет записывать каждый запрос в лог. можно читать от туда.
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39056682
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Closiuskealon(Ruslan)Closius,
в некоторых базах есть встроенные средства индексирования для поддержки таких запросов
например в SQLite есть определённые флаги компиляции которые позволяют добавить поддерживание двумерных индексов для выборок вида (x1<x<x2)and(y1<y<y2) (вроде через регионы реализованы)

Не очень понял как это мне поможет.
намекаю что вы изобретаете лисапед, который уже есть в большинстве БД
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39057843
Closius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Closiusпропущено...


Не очень понял как это мне поможет.
намекаю что вы изобретаете лисапед, который уже есть в большинстве БД

И где мне про это почитать?

Вообще мне просто надо хранить квадро дерево. И нужен способ его хранения в БД
...
Рейтинг: 0 / 0
Подскажи по оптимизации индексирования при построении квадродерева
    #39058009
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажи по оптимизации индексирования при построении квадродерева
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]