powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Быстро посчитать расстояние между точками в пространстве?
16 сообщений из 16, страница 1 из 1
Быстро посчитать расстояние между точками в пространстве?
    #40103806
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, есть трекер, который пишет координаты объекта в трех плоскостях, записей очень много, хочется найти оптимальный и максимально быстрый способ посчитать расстояние пройдённое объектом, для пример взял 200 строк:
x y z-16613 124065 -3112-11953 123486 -3088-14690 121010 -2984-14325 126532 -3144-16612 124288 -3112-11991 123485 -3088-14684 121045 -2984-16587 124302 -3112-14037 126499 -3144-14012 126595 -3144-16665 124311 -3112-14693 121040 -2984-11973 123494 -3088-11957 123496 -308849367 121509 -5408-11938 123765 -3080-16636 124307 -3112-16636 124325 -3112-14693 121088 -2992-11950 123506 -3088-14032 126548 -3144-14033 126478 -3144-21390 181128 -5728-14686 121031 -2984-14738 120968 -298445430 122117 -5408114686 48690 -4528114478 48551 -4552114661 48660 -4536114673 48689 -4528125401 43021 -3584124835 50042 -358451710 121948 -540882179 67459 -298449375 121525 -5408119052 115553 -375253543 172825 -497653544 172795 -4976107950 179212 -367253550 172778 -497653588 172748 -4976173670 17874 -341648205 177711 -497617387 111481 -658418878 112592 -6584176776 -119657 -4096123140 135084 -4824168204 27270 -3664115847 14804 1944117042 15826 1944116685 16375 1944168230 28582 -360875166 78399 -5274116821 16763 1944116642 16380 194482407 80890 -512082376 80427 -5120115890 13959 1944-14620 121425 -2984-14587 121346 -2984-12287 123551 -308897508 -18680 -275280932 53075 -156081621 56200 -152081601 56196 -152096136 -22502 -2288116950 16616 194481627 56232 -152081605 56200 -152097091 -18435 -274480923 53092 -156081590 56232 -152081600 56212 -152081615 56201 -152081629 56195 -152081606 56207 -152081619 56200 -152080961 53047 -156018335 145735 -310481602 56210 -152080947 53075 -156017946 145593 -308018617 145272 -3112-16283 124129 -3112-14515 121315 -2984-14645 121381 -2984-14593 121332 -2984-14594 121323 -2984-14623 121373 -2984-14656 121342 -2984-14623 121273 -2984-14576 121319 -2984-14592 121128 -2984-14534 121300 -298410300 189025 -3712125415 43023 -3584-54650 83727 -344046548 176249 -4976143960 86870 -5424100061 -20209 -3040-14470 123855 -3112-14483 123769 -3112-14499 123799 -3112-14519 123748 -3112-14499 123685 -311282167 81004 -512082295 81221 -5120-14563 121712 -3000143957 86866 -5424108566 25942 -348097408 -19548 -2696-14396 123838 -3112-14466 123821 -3112-14534 121679 -3000-14370 123045 -3112-14380 123241 -3112-14596 121698 -3000-14337 123895 -3112-14519 121657 -300057011 18784 -5160-14348 123693 -3112-14445 123760 -3112-14487 122051 -3048-15399 123877 -3112-14494 123738 -3112-14704 122032 -3048-14542 122818 -3112-14415 123623 -3112-14542 122796 -3112-14420 122547 -3112-14376 123875 -3112-14469 123209 -3112-14399 124009 -3112-14510 123706 -3112-14677 122159 -3064-14258 123428 -3112-14683 121945 -3032-14608 122014 -3048-14448 121885 -3032-14572 122551 -3112-14487 123742 -3112-15113 124027 -3112-15314 124131 -3112-15926 124044 -311267534 39959 -3712-23994 181232 -5600172700 -214552 -3528173651 -214543 -356871343 125512 -3584175320 29581 -3728171327 12722 -2696112700 210803 -3680-45725 110923 -3800115346 13774 598480663 82252 -512029763 107490 -3712-22290 152045 -3064-22093 152044 -3056181480 -114281 -608065592 38303 -3792-16225 124219 -3112-14115 126280 -3136-14632 121424 -2984-18155 -102115 -2088-45352 111231 -3800-14125 126331 -3136-14568 121355 -2984-14568 121335 -2984-12230 123563 -3088-14146 126354 -3136-12272 123529 -3088-14553 121288 -2984-14128 126202 -3136-14578 121348 -2984-12922 137979 -3616-14189 126176 -3136-16288 124268 -3112-14646 121403 -2984143959 86864 -542482840 251836 -10592115263 74388 -2608182835 61373 -3992115320 74445 -2608116122 77654 -2696116350 77368 -2712116450 78038 -2680116374 77891 -2680118099 76109 -2688116327 77834 -2672119812 157815 -3736119559 157737 -3736118128 75966 -2688119626 157559 -3736119927 157787 -3736118001 75978 -2688116230 77773 -2680116296 77682 -2696119458 156696 -3736119525 157083 -3736116575 78214 -2640


Вариант с последовательным сравнением каждой строки со следующей и вычисления расстояния между этими точками - первое что приходит в голову. Но боюсь, что на больших объемах - этот вариант будет поглощать огромное количество мощностей.

Кто-то может знаком с более оптимальными алгоритмами?
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103810
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

это решает архитектурно элементарно. Трекер пишет координаты и сразу же рассчитывается расстояние пройденное от предъидущей точки. "Утяжеление" очень небольшое в моменте выходит.

Потом когда надо суммируете эти расстояния и всё.
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103831
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, возможно ли произвести расчет расстояний использую оконную функцию? Не имею опыта работы с оконными функциями, но изучив вопрос не могу понять как мне применить этот алгоритм к моей задаче.

Я создал функцию для расчета расстояния, в функцию передаю 6 значений (x1,y1,z1,x2,y2,z2)

Код: sql
1.
select dbo.[Distance_calculation] (@x1,@y1,@z1,@x2,@y2,@z2)


Получаю расстояние. Как мне использовать эту функцию в связке с оконной функцией?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT	
	   [ObjectID]
	   ,DTIME
	   ,????????????????????? --SQRT(POWER((@x2-@x1),2)+POWER((@y2-@y1),2)+POWER((@z2-@z1),2))
OVER (
      PARTITION BY ObjectID
      ORDER BY DTIME
      ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING
      )
FROM [db].[dbo].[packet_06]
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103843
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так обсчитал:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
;WITH CTE AS 
(
SELECT	[ObjectID],DTIME,x,y,z,ROW_NUMBER()
OVER(PARTITION BY ObjectID ORDER BY DTIME ASC) rn
FROM [db].[dbo].[packet_06] where ObjectID=158
)
SELECT [dbo].[Distance_calculation](T1.x,T1.y,T1.z,T2.x,T2.y,T2.z)
FROM CTE T1
INNER JOIN CTE T2
    ON T1.ObjectID = T2.ObjectID
    AND T1.rn  = T2.rn -1
GROUP BY T1.ObjectID,T1.x,T1.y,T1.z,T2.x,T2.y,T2.z
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103855
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1.
Дельта расстояний = sqrt(dx^2+dy^2+dz^2).

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

как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1.
Дельта расстояний = sqrt(dx^2+dy^2+dz^2).

Для поиска пути на любом произвольном отрезке достаточно просуммировать дельты.


Что бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы и на реплике повесить такой триггер, в таком случае вставка останется быстрой. Я ничего не упускаю?
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103870
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем скалярная функция? Чтобы было как можно медленнее?
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103876
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Владислав Колосов
teCa,

как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1.
Дельта расстояний = sqrt(dx^2+dy^2+dz^2).

Для поиска пути на любом произвольном отрезке достаточно просуммировать дельты.


Что бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы и на реплике повесить такой триггер, в таком случае вставка останется быстрой. Я ничего не упускаю?


Если сильно хочется оптимизировать, сделайте брокерскую очередь+сервис и там считайте.
А репликация добавит сильно много сущностей.
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103878
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

Я рекомендую посмотреть два направления
1) Сразу при поступления записи инкрементить расстояние
2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи)


И посмотрите базу данных MapD -- она должна быть заточена под такие задачи.
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103885
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
teCa,

Я рекомендую посмотреть два направления
1) Сразу при поступления записи инкрементить расстояние
2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи)


И посмотрите базу данных MapD -- она должна быть заточена под такие задачи.


Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности?
Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется.
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103887
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
a_voronin
teCa,

Я рекомендую посмотреть два направления
1) Сразу при поступления записи инкрементить расстояние
2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи)


И посмотрите базу данных MapD -- она должна быть заточена под такие задачи.


Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности?
Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется.


Брокер -- самое медленное решение из возможных. А самое быстрое -- это GPU.
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103893
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Норм движуха пошла
давай запилим кластер кафки, микросервисы на питоне под опеншифт, хранить в кластере кликхауса

а тупой джоб не сможет досчитывать по регламенту свежеприбывшее? можно с inmemory поразвлекаться, нативной компиляцией..
или надо модно-стильно-молодежно из кучи разнородного хлама, чтобы потом страдать, эксплуатируя этот "самолёт с бассейном, казино и пр." в продакте?
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40103930
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а пространственные типы и функции не помогут?
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40104040
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Ролг Хупин
пропущено...


Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности?
Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется.


Брокер -- самое медленное решение из возможных. А самое быстрое -- это GPU.


п-ц, извините, вырвалось
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40104043
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy st
Норм движуха пошла
давай запилим кластер кафки, микросервисы на питоне под опеншифт, хранить в кластере кликхауса

а тупой джоб не сможет досчитывать по регламенту свежеприбывшее? можно с inmemory поразвлекаться, нативной компиляцией..
или надо модно-стильно-молодежно из кучи разнородного хлама, чтобы потом страдать, эксплуатируя этот "самолёт с бассейном, казино и пр." в продакте?


тупой джоб не понимает, какая версия сервера у ТС, похоже даже и сам ТС не понимает, что такое версия сервера.
Такие временища
...
Рейтинг: 0 / 0
Быстро посчитать расстояние между точками в пространстве?
    #40104075
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

авторЧто бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы
Как частный случай, можно настроить CDC для таблицы и написать обработчик. Но я уверен, что триггер +индекс + запись в отдельную таблицу заметно не замедлит производительность.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Быстро посчитать расстояние между точками в пространстве?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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