Size: a a a

2020 April 30

x

x-foby in Go-go!
Daniel Podolsky
а о чем речь?
Спички сравниваем.
select count(1) != 0 from ... where ... limit 1

vs
select exists(select 1 from ... where ... limit 1)
источник

DP

Daniel Podolsky in Go-go!
и что, есть разница?!
источник

s

sexst in Go-go!
Должна быть
источник

DP

Daniel Podolsky in Go-go!
откуда?
источник

s

sexst in Go-go!
Запросы (насколько я вижу из этих кусков) логически кардинально разные
Можно explain analyze сделать и посмотреть план
источник

X

Xo in Go-go!
А го умеет с gpu? Например хочу вычислять md5 на карточке (не cuda)
источник

AT

Anton Terisback in Go-go!
Gorgonia как-то может в gpu, но может есть что-то более очевидное
источник

AT

Anton Terisback in Go-go!
Но она видимо работает только с CUDA, увы
источник

AT

Anton Terisback in Go-go!
Есть биндинг OpenCL, https://github.com/go-gl/cl
источник

DP

Daniel Podolsky in Go-go!
sexst
Запросы (насколько я вижу из этих кусков) логически кардинально разные
Можно explain analyze сделать и посмотреть план
можно, и, я уверен, оно покажет один и тот же план
источник

s

sexst in Go-go!
Daniel Podolsky
можно, и, я уверен, оно покажет один и тот же план
Минут через 10 проверю.
источник

x

x-foby in Go-go!
sexst
Запросы (насколько я вижу из этих кусков) логически кардинально разные
Можно explain analyze сделать и посмотреть план
Что в них кардинально разного-то?
источник

DP

Daniel Podolsky in Go-go!
x-foby
Что в них кардинально разного-то?
ща увидим!
источник

x

x-foby in Go-go!
Daniel Podolsky
можно, и, я уверен, оно покажет один и тот же план
Не один и тоже, но и не кардинально отличающийся
источник

x

x-foby in Go-go!
Daniel Podolsky
ща увидим!
Да я смотрел уже, мы там выше про план говорили уже)
источник

s

sexst in Go-go!
network=# explain (analyze, verbose, buffers) select exists(select 1 from address.ao where ao_level=7 limit 1);
                                                    QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
Result  (cost=0.04..0.05 rows=1 width=0) (actual time=0.015..0.015 rows=1 loops=1)
  Output: $0
  Buffers: shared hit=1
  InitPlan 1 (returns $0)
    ->  Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..0.012 rows=1 loops=1)
          Filter: (ao.ao_level = 7)
          Buffers: shared hit=1
Planning time: 0.840 ms
Execution time: 0.293 ms
(9 строк)

network=# explain (analyze, verbose, buffers) select count(1)!=0 from address.ao where ao_level=7 limit 1;
                                                          QUERY PLAN                                                          
--------------------------------------------------------------------------------------------------------------------------------
Limit  (cost=44029.17..44029.19 rows=1 width=0) (actual time=332.232..332.233 rows=1 loops=1)
  Output: ((count(1) <> 0))
  Buffers: shared hit=26692
  ->  Aggregate  (cost=44029.17..44029.19 rows=1 width=0) (actual time=332.229..332.229 rows=1 loops=1)
        Output: (count(1) <> 0)
        Buffers: shared hit=26692
        ->  Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..238.177 rows=936664 loops=1)
              Filter: (ao.ao_level = 7)
              Rows Removed by Filter: 262594
              Buffers: shared hit=26692
Planning time: 0.115 ms
Execution time: 332.273 ms
(12 строк)
источник

s

sexst in Go-go!
Таки кардинально разный ожидаемо. В случае с exists оно после первой строки, удовлетворяющей where,  прекращает поиски ибо соображает что больше не нужно. При count сначала выборка вообще всех строк, удовлетворяющих where, потом для первой делается count(1) != 0 и на этом заканчивается
источник

s

sexst in Go-go!
А всё потому что count - агрегатная функция
источник

DP

Daniel Podolsky in Go-go!
Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..0.012 rows=1 loops=1)
Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..238.177 rows=936664 loops=1)


то есть - limit 1 нам ничего не дал?

или у вас там sort где-то затесался?
источник

s

sexst in Go-go!
Daniel Podolsky
Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..0.012 rows=1 loops=1)
Seq Scan on address.ao  (cost=0.00..41682.72 rows=938579 width=0) (actual time=0.012..238.177 rows=936664 loops=1)


то есть - limit 1 нам ничего не дал?

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