Tensor ru
Совпадение интервалов
Исправить это можно, добавив условие, чтобы отбирался наименьший id для пары одинаковых интервалов:
The site configured at this address does not contain the requested file.
А что такое, по сути, слайс из предыдущих элементов массива? А это как раз «накопительный» массив, если формировать его на «предыдущих» записях «окна» с обращенными сортировками:
Бессмысленный он по той простой причине, что сформировав больше 100M соединенных пар записей, 99% из них он вынужден был отфильтровать по условию.
Так что даже если вы уже оптимизировали запрос в 30 раз — всегда можно попробовать ускорить в 40 раз!
Проблема тут, ровно как и в исходном запросе, в том, что если два диапазона полностью совпадают, то потенциально, мы оба их удалим.
Как можно организовать такое в нашем «быстром» варианте?
Теперь в каждой такой группе надо всего лишь найти id интервалов, перекрытые каким-то из «соседей». Для этого развернем и пронумеруем массив интервалов с помощью unnest WITH ORDINALITY :
UPD: 02.10.24 — сборка массива «по окну»
Причем, даже если мы добавим в исходном запросе условие AND daterange(i.dtb, i.dte, ‘[]’) <> daterange(o.dtb, o.dte, ‘[]’) — это не исправит ситуацию, просто теперь они оба вместе останутся — все потому, что исходный запрос «симметричен» относительно обоих чтений таблиц.
If this is your site, make sure that the filename case matches the URL as well as any file permissions.
For root URLs (like http://example.com/ ) you must provide an index.html file.
Остается отобрать лишь те id , интервалы которых полностью покрыты кем-то из собранного массива.
Как сделать этот запрос эффективнее.
File not found
Мы молодцы? Ну, почти.
Поскольку id у нас заведомо уникален, то порядок сортировки элементов однозначен.
Тут мы сразу распределили интервалы и идентификаторы в два массива с [неважно каким, лишь бы] одинаковым порядком исходных записей ( ORDER BY id ).
Только вот его длительность, и так немалая, выросла втрое из-за многократного формирования daterange (это ой как недешево!):
Read the full documentation for more information about using GitHub Pages.
Давайте обратим внимание, что нам ведь нет разницы, с каким сегментом массива сравнивать — до элемента или после — главное, чтобы там оказались необходимые нам данные.
Для начала восстановим тестовую таблицу интервалов, которую мы использовали в статье «PostgreSQL Antipatterns: работаем с отрезками в «кровавом энтерпрайзе»», только записей-интервалов сделаем теперь миллион:
The site configured at this address does not contain the requested file.
А вот и его план — почти в 7 раз быстрее!
В этом случае очевидно, что «покрывающий» интервал может лежать в массиве только «правее» анализируемого (длина у него точно должна быть не меньше, а id — больше), и «клеить» слайсы нам больше нет необходимости:
По большому счету, никакой пользы от соединения таблицы с собой же, как и от сравнения записей с разными owner ‘ами нам вообще нет, так что давайте сразу разложим имеющиеся интервалы на непересекающиеся сегменты за один проход:
Помните замечание, что неважно в каком одинаковом порядке собирать записи в массивы? Давайте используем этот факт в свою пользу — отсортируем все интервалы одного owner ‘а сначала по длине dte — dtb , а потом по id :
File not found
Чтобы зря не формировать daterange (что, как мы уже выяснили, бывает весьма накладно) для записей, у которых все равно нет «предыдущих», проверку условия «спрячем под CASE «.
Как несложно заметить при анализе плана этого запроса на explain.tensor.ru, 98% всего времени ушло на достаточно бессмысленный Hash Join :
If this is your site, make sure that the filename case matches the URL as well as any file permissions.
For root URLs (like http://example.com/ ) you must provide an index.html file.
Все, наш запрос принял следующий вид:
Не факт, что в реальных условиях вам придется зачищать интервалы подобным образом на «миллионных» таблицах, но разница времени исполнения запроса в 30 раз стоит того, чтобы знать и о такой методике.
«Смотрю — слева диск C:, справа диск C. Зачем, думаю, мне два диска C: — и стер один нафиг.»древний анекдот
Мало того, что мы исправили досадную проблему совпадающих интервалов, так еще и умудрились сделать «быструю» версию почти вдвое быстрее:
Недавно попался на глаза примерно вот такой запрос, которым хотели отобрать в таблице (очевидно, для последующего удаления) все id записей интервалов, которые полностью перекрыты каким-то другим интервалом того же owner ‘а:
И как эффект. А весьма неплох — мы отыграли еще 27% времени:
В этом конкретном случае уникальный id нам дан по условию задачи, но он не является обязательным для устранения дубль-записей — можно воспользоваться ctid , как в статье «DBA: вычищаем клон-записи из таблицы без PK», если никто не пытается активно менять данные у нас «под ногами».
А можно ли быстрее.
Read the full documentation for more information about using GitHub Pages.
Источники:
https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html&rut=0bc9822fa8a6e54247fb611969f6955fff51cdb76ab4a32e53ac6677c1fcc46c
https://tensor.ru/uc/support&rut=8e3204ba6824c92444143d46f0e79dcc0fe633996716f400eba03c76a8a7d3c3
https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BD%D0%B7%D0%BE%D1%80&rut=eafc13065ba203fa9cef5ce0b22cd68cf63392dceb8cd9b8f76c4d29e9c7cbb9
https://tensor.ru/about&rut=6decf62a8ce0dc7f505a88fec0c1fcea3e178b8d42970dc5a2209eb4557f79b0
http://tensor.ru/&rut=5c7fb34a773e928b810c0fe4d5519806e4eef8096cd7e41e5e2e8fa0b0e1f785
https://tensor.art/&rut=309c9584dc300c6b63e1efbd30a29930c7ef56f3633cb5e83416da1f707b3610
https://habr.com/ru/companies/tensor/articles/847128/&rut=120215b3b6c5813542d0987bb3a81f3ee07af65782ef7a2b62b144302acb833d
https://pytorch.org/tutorials/beginner/basics/tensor_tutorial.html&rut=a770370a0201c147335232e6de765be5bf33e660ad35c91d9a296279a729fe74
https://users.math.msu.edu/users/iwenmark/Teaching/CMSE890/TENSOR_oseledets2011.pdf&rut=1d7b683becde1132edf9090db1a70901aaf8e89171ad704a4d6ccdd382425566