Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Насколько секунд "уснет" запрос? А почему? / 3 сообщений из 3, страница 1 из 1
28.06.2017, 14:40
    #39479077
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько секунд "уснет" запрос? А почему?
Насколько секунд "уснет" запрос?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH t(id) as (
	SELECT * FROM generate_series(1,10)
)
,s(object_id) as (
	SELECT *,pg_sleep(1) FROM generate_series(11,31)
)
SELECT * FROM t
WHERE id IN ( SELECT t.id FROM s)



Как оптимизатор это понял?
...
Рейтинг: 0 / 0
28.06.2017, 16:11
    #39479179
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько секунд "уснет" запрос? А почему?
Gold_,

если бы s вообще не использовался в результирующем запросе, он бы вообще даже не вычислялся (исключения insert/update returning).

но то, что не весь CTE материализуется, если он использован только в where -- довольно забавно.

сравните варианты :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
EXPLAIN (ANALYZE on, VERBOSE on, COSTS on, BUFFERS off, TIMING on )

WITH t(id) as (
	SELECT * FROM generate_series(1,10)
)
,s(id) as (
	SELECT *,pg_sleep(1)  FROM generate_series(11,31)
)
SELECT *  FROM t
WHERE	
	--id IN ( SELECT t.id  FROM s)
	--id IN ( SELECT t.id +(1.01*s.id  -1.0*s.id)::int    FROM s)
	--id IN ( SELECT t.id +(1.1*s.id  -1.0*s.id)::int    FROM s)
	--id IN ( SELECT t.id +(1.1*s.id  -1.0*s.id)::int -(0.1*s.id)::int    FROM s)
	--id =any (array ( SELECT t.id  FROM s)) --21 с
	EXISTS (select 1 FROM s)


--вычисляется единственная строка s, удовлетворяющая where для всех строк t -- и дальше не материализуем, за ненадобностью
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Result  (cost=22.52..42.52 rows=1000 width=4) (actual time=1001.075..1001.082 rows=10 loops=1)
  Output: t.id
  One-Time Filter: $2
  CTE t
    ->  Function Scan on pg_catalog.generate_series  (cost=0.00..10.00 rows=1000 width=4) (actual time=0.021..0.022 rows=10 loops=1)
          Output: generate_series.generate_series
          Function Call: generate_series(1, 10)
  CTE s
    ->  Function Scan on pg_catalog.generate_series generate_series_1  (cost=0.00..12.50 rows=1000 width=4) (actual time=1001.041..1001.041 rows=1 loops=1)
          Output: generate_series_1.generate_series, pg_sleep(1::double precision)
          Function Call: generate_series(11, 31)
  InitPlan 3 (returns $2)
    ->  CTE Scan on s  (cost=0.00..20.00 rows=1000 width=0) (actual time=1001.048..1001.048 rows=1 loops=1)
  ->  CTE Scan on t  (cost=0.00..20.00 rows=1000 width=4) (actual time=0.024..0.027 rows=10 loops=1)
        Output: t.id
Total runtime: 1001.114 ms



забавно
...
Рейтинг: 0 / 0
28.06.2017, 17:23
    #39479225
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько секунд "уснет" запрос? А почему?
qwwq,

Сравнил.
Не могу не согласится. Забавно.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Насколько секунд "уснет" запрос? А почему? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]