Перейти к публикации
  • Сейчас на странице   Всего пользователей: 2   (0 пользователей, 2 гостя)

Rooster

Программирование[8]

Рекомендованные сообщения

Да я же и переделаю назад сразу, просто типа покажу, "вот как просили переделал"

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

вот от этой фразы вообще кончил, сразу стало понятно, почему такие результаты получал

Еще бы пруф найти какой-то на эту тему, я был бы вообще счастлив 

Поделиться сообщением


Ссылка на сообщение

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 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

group by внутри exists работает кстати
я всё осознал

Вот что я написал (грубо) : "для каждой записи таблицы event_table захуярить следующий exists (тут код внутри exists)" - и он для каждой записи с object_id 1234 возвращает true, вот поэтому и выводит все 
А чтобы этого избежать нужен еще подзапрос
:palevojein: 
 

Поделиться сообщением


Ссылка на сообщение

ты написал для каждой строки таблицы слазь в эту же таблицу и проверь, что там есть группа, в которую входит ровно одна строка (ведь ты искал по айдишке и фактически нашел самого себя) с типом фак и объектом 1234. 

Группа внутри exists всегда находит либо 0 либо 1 строку, в зависимости от типа и объекта, больше никогда не сможет, тк event_id и так уникально. Group by офк работает, но он бесполезен, только путает оптимизатор

 

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


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

Короче в мой джойн смотрели 15 секунд и сказали, как правильно написать с экзистс, привожу для вас решение

 

для каждой записи с нужным object_id выбрать все записи для которых НЕ СУЩЕСТВУЕТ записей с тем же object_id но большей датой

 

SELECT table1.* FROM event_table table1

WHERE  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
            )


и никакая группировка не нужна =)

Поделиться сообщением


Ссылка на сообщение

ну да, только работает в пару сотен раз медленней, но ничего

мы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов

 

надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторе


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

а вот нифига кстати, по крайней мере на тестовой базе почти в 5 раз быстрее
 


да и я гуглил вчера этот вопрос сравнения exists и join - если не нужны возвращаемые значения нужно всегда exists юзать, оно быстрее

Поделиться сообщением


Ссылка на сообщение

если не нужны, то да

но ты ведь пишешь именно SELECT table1.*

если это "не нужны значения", то я зеллар

 

вариант что группировка может отработать хуже возможен только если вьюшка невероятно хуевая и оптимизатор умудряется сделать хуже

но даже с учетом этого маловероятно, тк что там что там фильтр одинаковый

только в запросе с exists ты всё делаешь лишних N раз на каждую строку запрос в эту же таблицу по object_id


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

подскажите про то, как работает EXISTS (субд oracle)

У меня вьюха для фиксации истории изменения файла, вида

object_id    event    time              event_id

1234           fuck      14.07.2019    1

1234           eat        13.07.2019    2

1111            fuck       12.07.2019   3

1234           fuck       15.07.2019   4

 

Мне нужно выбрать самое позднее событие fuck для элемента 1234

 

Я делаю запрос

 

SELECT object_id, MAX(time)

FROM  event_table

WHERE  event = 'fuck'

AND object_id = '1234'

GROUP BY object_id

 

Получаю - 1234 15.07.2019

 

С помощью JOIN я сделал все, надо переделать на EXISTS

Я пробую вот так

 

SELECT table1.*

FROM event_table table1

WHERE 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.2019

1234 15.07.2019

 

Что я не понимаю и делаю не так?

 

 

Oracle 12.1+

select * from table

where event = 'fuck'

and object_id = '1234'

order by time desc

fetch first 1 rows only

 

Oracle <12.1

select * from 

( select * from table

where event = 'fuck'

and object_id = '1234'

  order by time desc )

where ROWNUM <= 1

 

ебучий оракл только недавно смог в ограничение линий пиздец

срань, а не база данных


ASCFR.gif

Поделиться сообщением


Ссылка на сообщение
(изменено)

ну да, только работает в пару сотен раз медленней, но ничего

мы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов

 

надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторе

медленность конечно очень важна когда это запрос который один пользователь раз в год вызывает

чо за премачур оптимизации. вопрос в том что из этого более читаемее и очевиднее для команды


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

 

ну да, только работает в пару сотен раз медленней, но ничего

мы же любим вместо явного указания сгруппировать и при наличии правильного индекса сделать это за один проход, для каждой строки выполнять лишний подзапрос и получать n^2 относительно количества объектов

 

надеюсь оптимизатор оракла достаточно умен, чтобы убирать всю ту хуйню, что пишут твои учителя в твоей конторе

медленность конечно очень важна когда это запрос который один пользователь раз в год вызывает

чо за премачур оптимизации. вопрос в том что из этого более читаемее и очевиднее для команды

 

так первый и короче в 4 раза и выполняться должен быстрее


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

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


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.
 

Поделиться сообщением


Ссылка на сообщение

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

 

Земля пухом, если это душно.

 

По теме - тогда уж писал бы:

NOT EXISTS(
            SELECT 1
            FROM  event_table table2
            WHERE   table2.event_time > table1.event_time
            and table1.object_id = table2.object_id
            )

хоть чтоль.


 

DB

59221730.png


Я - гений, ёпта

bfe7003be27e8e81ce6a7d2d8192e9ae.jpg


22


msg-93176-0-72842500-1438846470_thumb.jpg

Поделиться сообщением


Ссылка на сообщение

 


 

Земля пухом, если это душно.

 

работа с ораклом - это земля пухом

Поделиться сообщением


Ссылка на сообщение

 

 

работа с ораклом - это земля пухом

 

Что предпочитаешь? 


 

DB

59221730.png


Я - гений, ёпта

bfe7003be27e8e81ce6a7d2d8192e9ae.jpg


22


msg-93176-0-72842500-1438846470_thumb.jpg

Поделиться сообщением


Ссылка на сообщение

предпочитаю не работать с ораклом, а вам для чего?

Поделиться сообщением


Ссылка на сообщение

Интересны мнение и аргументы офк. У меня вся практика вообще на сквель сервере, но слышал достаточно много хорошего про оракл.


 

DB

59221730.png


Я - гений, ёпта

bfe7003be27e8e81ce6a7d2d8192e9ae.jpg


22


msg-93176-0-72842500-1438846470_thumb.jpg

Поделиться сообщением


Ссылка на сообщение

третий день драфтим проект с каждым днём он все сложнее, а база всё огромнее. Сегодня уже дошли до решения в виде двух баз, одна ридонли, вторая хистори. Это решает множество проблем. Но как остановится. Мы уже в 10км от первоначального драфта. :opasnoste:


 

<< твой комментарий очень важен для форума.

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

 

 

Все иде какие-то уебищные еще для нее.

 

Вот это да. Пару раз ставил потраить - такое уебищное говно, пиздос просто.

 

У мс еще и куча сторонних решений классных есть. + ssms не так плоха + azure пилят + ебашить в вс коде никто не мешает, если влом сатвить для мелочевки всякой.


 

DB

59221730.png


Я - гений, ёпта

bfe7003be27e8e81ce6a7d2d8192e9ae.jpg


22


msg-93176-0-72842500-1438846470_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...