|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Здравствуйте. Posgresql 9.6 PostGis 2.4.2 При выполнении операции пересечения Код: plsql 1. 2. 3. 4.
появляется ошибка Код: plsql 1.
Дело, конечно в ошибках в геометрии. Без проблем мы находим 1000 битых записей(всего в таблице 100000 записей) запросом Код: plsql 1.
Но битые геометрии в выборку не попадают(у всех битых записей value<100). Значит такое возникает при проходе по пространственному индексу, который построен по всей таблице. Код: plsql 1.
Изменим индекс Код: plsql 1.
и ошибка уйдет. Но меня интересует как всё-таки можно найти на какой именно записи спотыкалось выполнение без изменения индекса? Код: plsql 1.
искал по этим значениям в координатах битых объектов, и в результате ST_IsValidReason, но такие записи не находятся Код: plsql 1. 2.
К сожалению, исправить всё через st_makevalid недопустимо, возможно несколько записей только и то с большим и долгим согласованием. Интересно было бы найти запись, которая не является частью выборки, но входит в индекс и мешает выполнению. Возможно кто-то сталкивался с решением подобной задачи-буду очень благодарен. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2020, 14:26 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Visermoz К сожалению, исправить всё через st_makevalid недопустимо, возможно несколько записей только и то с большим и долгим согласованием. Интересно было бы найти запись, которая не является частью выборки, но входит в индекс и мешает выполнению. Возможно кто-то сталкивался с решением подобной задачи-буду очень благодарен. Спасибо. если там есть primary key - то просто по нему перебираете построчно все записи через запрос вида Код: plsql 1. 2. 3. 4. 5.
и смотрите на каких id оно ломается. Скрипт на psql (через /gexec) или на bash пишется в пару строчек. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2020, 15:21 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Visermoz, кстати далеко не факт что "Но битые геометрии в выборку не попадают(у всех битых записей value<100)" - чем то вам поможет... а попробуйте запрос написать как Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
не ушла ли ошибка? ps: база совершенно не обязана проверять сначала g.value а потом лезть в st_intersects она вполне может и наоборот сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2020, 17:53 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Maxim Boguk,большое спасибо за советы. Попробую перебором ключей найти. и вариант с offset тоже проверю ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2020, 18:01 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Maxim Boguk,действительно с offset 0 запрос сработал - индекс в плане не участвовал. Еще раз спасибо за совет- возьму такой способ на вооружение. проверил вариант со скриптом и перебором. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
но результата не выдалось, т.к. условие g.value>100 фильтрует данные так, что запрос Код: plsql 1.
ничего не возвращает, и не выполняется ни одной итерации цикла. Но всё-таки интересно еще найти запись, которая в индексе сидит. Интересно, это вообще возможно без выполнения под отладкой? можно ли "заглянуть в индекс" и посмотреть как идет пробег по дереву? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2020, 07:52 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Visermoz Maxim Boguk,действительно с offset 0 запрос сработал - индекс в плане не участвовал. Еще раз спасибо за совет- возьму такой способ на вооружение. проверил вариант со скриптом и перебором. ... ничего не возвращает, и не выполняется ни одной итерации цикла. Но всё-таки интересно еще найти запись, которая в индексе сидит. Интересно, это вообще возможно без выполнения под отладкой? можно ли "заглянуть в индекс" и посмотреть как идет пробег по дереву? Тоже самое сделайте но без g.value>100 условия и все увидите. Я вам уже написал что база сначала пробует условия st_intersects(g.geom,st_geomfromtext('POINT(1 1)'))=true а потом уже проверят value>100 и попадает на невалидные строки таким образом. 'Но битые геометрии в выборку не попадают(у всех битых записей value<100).' - вот если сделать с offset 0 - тогда действительно не попадают. А вот в просто запросе еще как попадают. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2020, 09:07 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Maxim Boguk, "Тоже самое сделайте но без g.value>100 условия и все увидите." но тогда ведь это будет равнозначно запросу с st_isvalid!=true, т.к. большинство невалидной геометрией выдаст подобную ошибку. Код: plsql 1.
Запрос обязательно упадет на объектах с невалидной геометрией- эти объекты я получил запросом выше. Но, вероятно, не все 1000 битых объектов мешают выполнению запроса для точки POINT(1 1), а только несколько. и вот эти интересно найти. Как вариант, возможно, ловить исключение на варианте "Тоже самое сделайте но без g.value>100 условия и все увидите.", и сравнивать его текст с изначальной ошибкой Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2020, 09:19 |
|
Postgis: GEOSIntersects: TopologyException: side location conflict. Как найти строку?
|
|||
---|---|---|---|
#18+
Получилось найти таким способом, как советовал Maxim Boguk + сравнение по координатам ошибки. Возможно, кому-нибудь тоже пригодится Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2020, 12:04 |
|
|
start [/forum/topic.php?fid=53&gotonew=1&tid=1994609]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
11ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 168ms |
0 / 0 |