Matriarch #4301 16 июля 2019 Да я же и переделаю назад сразу, просто типа покажу, "вот как просили переделал" а та группировка, что написана внутри экзиста вообще нахуй не нужна, движок всё равно вырезает оттуда всё, кроме проверки факта наличия строки. одна там или много, может ему только помешать всё вырезать лишнюю работу вот от этой фразы вообще кончил, сразу стало понятно, почему такие результаты получалЕще бы пруф найти какой-то на эту тему, я был бы вообще счастлив Поделиться сообщением Ссылка на сообщение
Kant #4302 16 июля 2019 https://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions012.htm TRUE if a subquery returns at least one row. это же проверка на существование, а не количество. Получил хоть одну - можно останавливаться и дальше не искатьно у тебя там еще группировка ненужная, тк ты перед этим и так уже вытащил ровно одну строку, с ее наличием и с учетом, что это вьюшка, а не таблица, я сомневаюсь, что оптимизатор в состоянии всю эту хуйню удалить фактически твой запрос это select * from event_table t1 where exists (select * from event_table t2 where t2.event_id = t1.event_id and t2.object_id = 1234 and t2.event = 'fuck') что полный логический эквивалентselect * from event_table t1 where t1.object_id = 1234 and t1.event = 'fuck' очевидно группировка отсутствует Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
Matriarch #4303 16 июля 2019 group by внутри exists работает кстатия всё осозналВот что я написал (грубо) : "для каждой записи таблицы event_table захуярить следующий exists (тут код внутри exists)" - и он для каждой записи с object_id 1234 возвращает true, вот поэтому и выводит все А чтобы этого избежать нужен еще подзапрос Поделиться сообщением Ссылка на сообщение
Kant #4304 16 июля 2019 ты написал для каждой строки таблицы слазь в эту же таблицу и проверь, что там есть группа, в которую входит ровно одна строка (ведь ты искал по айдишке и фактически нашел самого себя) с типом фак и объектом 1234. Группа внутри exists всегда находит либо 0 либо 1 строку, в зависимости от типа и объекта, больше никогда не сможет, тк event_id и так уникально. Group by офк работает, но он бесполезен, только путает оптимизатор и какие бы подзапросы ты не писал, это не даст тебе возможности сгруппировать внешний запрос, чтобы получить твою первую строку Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
Matriarch #4305 16 июля 2019 Короче в мой джойн смотрели 15 секунд и сказали, как правильно написать с экзистс, привожу для вас решение для каждой записи с нужным object_id выбрать все записи для которых НЕ СУЩЕСТВУЕТ записей с тем же object_id но большей датой SELECT table1.* FROM event_table table1WHERE table1.event= 'fuck'and table1.object_id = '1234'AND NOT EXISTS( SELECT table2.object_id, event_time FROM event_table table2 WHERE table2.event_time > table1.event_time and table1.object_id = table2.object_id )и никакая группировка не нужна =) Поделиться сообщением Ссылка на сообщение
Kant #4306 16 июля 2019 ну да, только работает в пару сотен раз медленней, но ничегомы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторе Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
Matriarch #4307 16 июля 2019 а вот нифига кстати, по крайней мере на тестовой базе почти в 5 раз быстрее да и я гуглил вчера этот вопрос сравнения exists и join - если не нужны возвращаемые значения нужно всегда exists юзать, оно быстрее Поделиться сообщением Ссылка на сообщение
Kant #4308 16 июля 2019 если не нужны, то дано ты ведь пишешь именно SELECT table1.*если это "не нужны значения", то я зеллар вариант что группировка может отработать хуже возможен только если вьюшка невероятно хуевая и оптимизатор умудряется сделать хужено даже с учетом этого маловероятно, тк что там что там фильтр одинаковыйтолько в запросе с exists ты всё делаешь лишних N раз на каждую строку запрос в эту же таблицу по object_id Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
sol1tary #4309 16 июля 2019 подскажите про то, как работает EXISTS (субд oracle)У меня вьюха для фиксации истории изменения файла, видаobject_id event time event_id1234 fuck 14.07.2019 11234 eat 13.07.2019 21111 fuck 12.07.2019 31234 fuck 15.07.2019 4 Мне нужно выбрать самое позднее событие fuck для элемента 1234 Я делаю запрос SELECT object_id, MAX(time)FROM event_tableWHERE event = 'fuck'AND object_id = '1234'GROUP BY object_id Получаю - 1234 15.07.2019 С помощью JOIN я сделал все, надо переделать на EXISTSЯ пробую вот так SELECT table1.*FROM event_table table1WHERE EXISTS ( SELECT table2.object_id, MAX(time) FROM event_table table2 WHERE event = 'fuck' AND table1.event_id= table2.event_id AND table2.object_id = '1234'; GROUP BY table2.object_id ) и мне выводит1234 14.07.20191234 15.07.2019 Что я не понимаю и делаю не так? Oracle 12.1+select * from tablewhere event = 'fuck'and object_id = '1234'order by time descfetch first 1 rows only Oracle <12.1select * from ( select * from tablewhere event = 'fuck'and object_id = '1234' order by time desc )where ROWNUM <= 1 ебучий оракл только недавно смог в ограничение линий пиздецсрань, а не база данных Поделиться сообщением Ссылка на сообщение
Just.Doit #4310 16 июля 2019 (изменено) ну да, только работает в пару сотен раз медленней, но ничегомы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторемедленность конечно очень важна когда это запрос который один пользователь раз в год вызываетчо за премачур оптимизации. вопрос в том что из этого более читаемее и очевиднее для команды Изменено 16 июля 2019 пользователем Just.Doit очень крутые котейкиКому-то пизды дал - нужно сделать скрин обязательно. (с) Solo Поделиться сообщением Ссылка на сообщение
Kant #4311 16 июля 2019 ну да, только работает в пару сотен раз медленней, но ничегомы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторемедленность конечно очень важна когда это запрос который один пользователь раз в год вызываетчо за премачур оптимизации. вопрос в том что из этого более читаемее и очевиднее для команды так первый и короче в 4 раза и выполняться должен быстрее Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Поделиться сообщением Ссылка на сообщение
JuJeu #4312 16 июля 2019 Дело даже не в скорости. Просто это супер душный код. Пока разберёшься зачем это, куча времени уйдёт. Понятно дело, что тут пример в вакууме, но, а если в такое в реальности написать, ну нахуй))) Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders. Поделиться сообщением Ссылка на сообщение
Arzanis #4313 16 июля 2019 Дело даже не в скорости. Просто это супер душный код. Пока разберёшься зачем это, куча времени уйдёт. Понятно дело, что тут пример в вакууме, но, а если в такое в реальности написать, ну нахуй))) Земля пухом, если это душно. По теме - тогда уж писал бы: NOT EXISTS( SELECT 1 FROM event_table table2 WHERE table2.event_time > table1.event_time and table1.object_id = table2.object_id ) хоть чтоль. DB Я - гений, ёпта 22 Поделиться сообщением Ссылка на сообщение
sonac #4314 16 июля 2019 Земля пухом, если это душно. работа с ораклом - это земля пухом Поделиться сообщением Ссылка на сообщение
Arzanis #4315 16 июля 2019 работа с ораклом - это земля пухом Что предпочитаешь? DB Я - гений, ёпта 22 Поделиться сообщением Ссылка на сообщение
sonac #4316 16 июля 2019 предпочитаю не работать с ораклом, а вам для чего? Поделиться сообщением Ссылка на сообщение
Arzanis #4317 16 июля 2019 Интересны мнение и аргументы офк. У меня вся практика вообще на сквель сервере, но слышал достаточно много хорошего про оракл. DB Я - гений, ёпта 22 Поделиться сообщением Ссылка на сообщение
SKYnv #4318 16 июля 2019 третий день драфтим проект с каждым днём он все сложнее, а база всё огромнее. Сегодня уже дошли до решения в виде двух баз, одна ридонли, вторая хистори. Это решает множество проблем. Но как остановится. Мы уже в 10км от первоначального драфта. << твой комментарий очень важен для форума. Поделиться сообщением Ссылка на сообщение
MedVed_na_lesapede #4319 16 июля 2019 Всю жизнь и в инсте и на галерах предыдущих работал с божественным mssql, а щас на новом судне postgresql, ну такое бля.... чего только стоит экран камэл кейсовых названий двойными кавычками, это пиздец блять. Все иде какие-то уебищные еще для нее. Поделиться сообщением Ссылка на сообщение
Arzanis #4320 16 июля 2019 Все иде какие-то уебищные еще для нее. Вот это да. Пару раз ставил потраить - такое уебищное говно, пиздос просто. У мс еще и куча сторонних решений классных есть. + ssms не так плоха + azure пилят + ебашить в вс коде никто не мешает, если влом сатвить для мелочевки всякой. DB Я - гений, ёпта 22 Поделиться сообщением Ссылка на сообщение