Size: a a a

2020 April 30

s

sexst in Go-go!
Александр Попов
не во всех субд конечно
Да почти во всех, валидный вложенный запрос же. Только алиас для subselect нужно какой-то указать в конце ещё.
источник

s

sexst in Go-go!
Daniel Podolsky
слова select from select вам что-нибудь говорят, коллега?
Так имелось в виду?
network=#  explain (analyze,  buffers) select * from (select * from address.ao where ao_level=7) s1 limit 1;
                                                QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
Limit  (cost=0.00..0.04 rows=1 width=138) (actual time=0.015..0.016 rows=1 loops=1)
  Buffers: shared hit=1
  ->  Seq Scan on ao  (cost=0.00..41682.72 rows=938579 width=138) (actual time=0.014..0.014 rows=1 loops=1)
        Filter: (ao_level = 7)
        Buffers: shared hit=1
Planning time: 0.140 ms
Execution time: 0.053 ms
(7 строк)

Или так?
network=#  explain (analyze, buffers) select count(1)!=0 from (select * from address.ao where ao_level=7 limit 1) s1;
                                                  QUERY PLAN                                                    
-----------------------------------------------------------------------------------------------------------------
Aggregate  (cost=0.06..0.07 rows=1 width=0) (actual time=0.021..0.021 rows=1 loops=1)
  Buffers: shared hit=1
  ->  Limit  (cost=0.00..0.04 rows=1 width=0) (actual time=0.015..0.015 rows=1 loops=1)
        Buffers: shared hit=1
        ->  Seq Scan on ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.014..0.014 rows=1 loops=1)
              Filter: (ao_level = 7)
              Buffers: shared hit=1
Planning time: 0.152 ms
Execution time: 0.073 ms
(9 строк)
источник

x

x-foby in Go-go!
sexst
Так имелось в виду?
network=#  explain (analyze,  buffers) select * from (select * from address.ao where ao_level=7) s1 limit 1;
                                                QUERY PLAN                                                  
-------------------------------------------------------------------------------------------------------------
Limit  (cost=0.00..0.04 rows=1 width=138) (actual time=0.015..0.016 rows=1 loops=1)
  Buffers: shared hit=1
  ->  Seq Scan on ao  (cost=0.00..41682.72 rows=938579 width=138) (actual time=0.014..0.014 rows=1 loops=1)
        Filter: (ao_level = 7)
        Buffers: shared hit=1
Planning time: 0.140 ms
Execution time: 0.053 ms
(7 строк)

Или так?
network=#  explain (analyze, buffers) select count(1)!=0 from (select * from address.ao where ao_level=7 limit 1) s1;
                                                  QUERY PLAN                                                    
-----------------------------------------------------------------------------------------------------------------
Aggregate  (cost=0.06..0.07 rows=1 width=0) (actual time=0.021..0.021 rows=1 loops=1)
  Buffers: shared hit=1
  ->  Limit  (cost=0.00..0.04 rows=1 width=0) (actual time=0.015..0.015 rows=1 loops=1)
        Buffers: shared hit=1
        ->  Seq Scan on ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.014..0.014 rows=1 loops=1)
              Filter: (ao_level = 7)
              Buffers: shared hit=1
Planning time: 0.152 ms
Execution time: 0.073 ms
(9 строк)
limit 1 в подзапрос нужно
источник

s

sexst in Go-go!
Тут агрегирующей функции нет, оно соображает
источник

s

sexst in Go-go!
x-foby
limit 1 в подзапрос нужно
Так неинтересно, и так будет понятно что к чему
источник

x

x-foby in Go-go!
sexst
Так неинтересно, и так будет понятно что к чему
explain (analyze, verbose, buffers) select count(1) != 0 from (select * from address.ao where ao_level=7 limit 1) s1;

Ну вот этот вариант будет по сути максимально похожим на вариант с exists.

Поясню: я за вариант с exists, мне он кажется более идиоматичным и на пару спичек более быстрым.
Но вопрос-то был в том, что принципиальной разницы между этими вариантами (правильно написанными) нет.
Пока что так и выходит.
источник

s

sexst in Go-go!
x-foby
explain (analyze, verbose, buffers) select count(1) != 0 from (select * from address.ao where ao_level=7 limit 1) s1;

Ну вот этот вариант будет по сути максимально похожим на вариант с exists.

Поясню: я за вариант с exists, мне он кажется более идиоматичным и на пару спичек более быстрым.
Но вопрос-то был в том, что принципиальной разницы между этими вариантами (правильно написанными) нет.
Пока что так и выходит.
Оно всё равно несколько отличается. По перформансу и по планированию exists быстрее несколько. Потому что и агрегирующую функцию лишний раз не вызываем и сам запрос проще спланировать.
Ну и идиоматичнее, короче и проще воспринимается, да
источник

V

V---V in Go-go!
Господа, а реальные проекты пишут под  виндой, или большинство в линуксе?
источник

s

sexst in Go-go!
V---V
Господа, а реальные проекты пишут под  виндой, или большинство в линуксе?
Учитывая тот факт, что они как правило для запуска под линуксом пишутся, весьма странно было бы их под виндой писать.
источник

V

V---V in Go-go!
Так есть же серваки с виндой
источник

AT

Anton Terisback in Go-go!
Yes, but actually not
источник

x

x-foby in Go-go!
sexst
Оно всё равно несколько отличается. По перформансу и по планированию exists быстрее несколько. Потому что и агрегирующую функцию лишний раз не вызываем и сам запрос проще спланировать.
Ну и идиоматичнее, короче и проще воспринимается, да
Согласен полностью.

Я ж говорю, не согласен был только с тем, что есть какая-то кардинальная разница, потому что прям кардинальной нет, но это не говорит, что примеры идентичны.
Собственно, меня больше удивило, что у автора варианта с count(1) != 0 этот вариант почему-то отрабатывает быстрее, хотя это и не логично, и у меня, допустим, это не так.
источник

s

sexst in Go-go!
x-foby
Согласен полностью.

Я ж говорю, не согласен был только с тем, что есть какая-то кардинальная разница, потому что прям кардинальной нет, но это не говорит, что примеры идентичны.
Собственно, меня больше удивило, что у автора варианта с count(1) != 0 этот вариант почему-то отрабатывает быстрее, хотя это и не логично, и у меня, допустим, это не так.
Так небось запустил один раз и аккурат в то время, пока там ещё что-то толстожопое отрабатывало параллельно.
источник

x

x-foby in Go-go!
sexst
Так небось запустил один раз и аккурат в то время, пока там ещё что-то толстожопое отрабатывало параллельно.
Ну я другого объяснения тоже найти не могу)
источник

IK

Ivan Kozlov in Go-go!
Подскажите по GORM many2many
не могу нагуглить.
type Offer {
   Countries      []Country `json:"countries" gorm:"many2many:offer_countries;"`
}

GetDB().Create(offer)

как сделатьт так, чтобы он не лез выполнять update в справочник countries
задача инсерт основной сущности(Offer) и ассоциативной таблицы offer_countries
источник

J

Jefferson in Go-go!
Подскажите, как в MySQL обновить данные сразу для нескольких записей?
Пытаюсь сделать это так:
UPDATE `data` SET `for_users` = `for_users` + ',test1,' WHERE `id` = '1' AND `id` = '2'
Но это не работает
источник

IK

Ivan Kozlov in Go-go!
Jefferson
Подскажите, как в MySQL обновить данные сразу для нескольких записей?
Пытаюсь сделать это так:
UPDATE `data` SET `for_users` = `for_users` + ',test1,' WHERE `id` = '1' AND `id` = '2'
Но это не работает
немного не тот чат, но
where id in (1,2)
условие попробуй сам в слух произнеси. у тебя нет в бд записи у которой id был бы равен 1 и 2
1 ИЛИ 2
источник

АП

Александр Попов... in Go-go!
эм IN это же не И а ИЛИ
источник

АП

Александр Попов... in Go-go!
источник

NK

Nur Kutlugallyamov in Go-go!
*testing.T иногда прокидывают в хелперы тестов.
Кто нибудь может сказать плюс такого подхода?
От меня плюсы:
1. Это красиво выглядит;
2. Можно ошибки оставлять внутри и проверять через assert.NoError(t, err).
Есть ли ещё или это вообще не плюсы?)
источник