powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
10 сообщений из 35, страница 2 из 2
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521111
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупинпропущено...


не буду

"не всегда" будет правильным.
нет гарантии, что будет правильным

Приведите пример где оно МОЖЕТ теоретически дать неверный ответ. ;)
Благо это самое стандартное преобразование для union all из тех что я знаю для ускорения.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

Ну, напримери, вы выше писали

1. писать запросы руками и вставлять limit 10 в обе части union all
2. затем приводили пример:
select * from
(select ...
LIMIT [offset+limit]
) UNION ALL
(select ...
LIMIT [offset+limit]
)
ORDER BY ...
OFFSET offset
LIMIT limit;

Например, если не будет одинаковой сортировки в подзапросах в этом случае возможно проявится проблема
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521153
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
авторБлаго это самое стандартное преобразование для union all из тех что я знаю для ускорения.

приведите плиз пример как преобразовать UNION ALL ?
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521164
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинMaxim Bogukпропущено...


Приведите пример где оно МОЖЕТ теоретически дать неверный ответ. ;)
Благо это самое стандартное преобразование для union all из тех что я знаю для ускорения.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

Ну, напримери, вы выше писали

1. писать запросы руками и вставлять limit 10 в обе части union all
2. затем приводили пример:
select * from
(select ...
LIMIT [offset+limit]
) UNION ALL
(select ...
LIMIT [offset+limit]
)
ORDER BY ...
OFFSET offset
LIMIT limit;

Например, если не будет одинаковой сортировки в подзапросах в этом случае возможно проявится проблема

А ORDER BY в подзапросах на что?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521225
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovqwwq,

А можете предоставить скрипты для вашей таблицы `t_t`? чтобы был самодостаточный демонстрационный пример?
табличка модельная, отсюда :
20003776

добавлены индексы по fld на все партиции и головную. (без паттернопсов)
и вставлено дважды по 100000 поверх тех 1000, что было в. (итого -- по 100500 на партицию.) генератором серий.
// в fld ~ g % 500 ? кажется

если хотите всё в одном месте -- чуть позже соберу.
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521266
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупинпропущено...


Ну, напримери, вы выше писали

1. писать запросы руками и вставлять limit 10 в обе части union all
2. затем приводили пример:
select * from
(select ...
LIMIT [offset+limit]
) UNION ALL
(select ...
LIMIT [offset+limit]
)
ORDER BY ...
OFFSET offset
LIMIT limit;

Например, если не будет одинаковой сортировки в подзапросах в этом случае возможно проявится проблема

А ORDER BY в подзапросах на что?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


см. выше, вы о них не писали, вот и я сделал примечание.
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521385
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,
из 19757774

create and data
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
DROP TABLE if exists t_t  cascade;

CREATE TABLE t_t 
(part integer NOT NULL 
,t_id serial primary key
,fld text 
,CHECK (part is null ) no inherit 
);
CREATE INDEX ON t_t (fld);
CREATE TABLE t_1
(
LIKE t_t INCLUDING INDEXES
,CHECK (part =1 ) no inherit 
)
inherits (t_t)
;
CREATE TABLE t_2
(
LIKE t_t INCLUDING INDEXES
,CHECK (part = 2 ) no inherit 
)
inherits (t_t)
;
CREATE VIEW t AS select * from t_t;
ALTER TABLE t ALTER t_id SET DEFAULT nextval('t_t_t_id_seq'::regclass); -- удобства на улице

CREATE OR REPLACE FUNCTION part_insert_trigger()
RETURNS TRIGGER AS $body$
BEGIN
	IF (NEW.part= 1) THEN
		INSERT INTO t_1 VALUES (NEW.*);
	ELSIF (NEW.part = 2) THEN
		INSERT INTO t_2 VALUES (NEW.*);
	ELSE
		--RAISE EXCEPTION 'partition key is out of range.  Fix the trigger function';
		INSERT INTO t_t VALUES (NEW.*);
	END IF;
	RETURN NEW; -- RETURN NEW in this case, typically you'd return NULL from this trigger, but for views we return NEW
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER ins
INSTEAD OF INSERT ON t
FOR EACH ROW EXECUTE PROCEDURE part_insert_trigger(); -- create "INSTEAD OF" trigger
---UPDATE---
CREATE OR REPLACE FUNCTION part_update_trigger()
RETURNS TRIGGER AS $body$
BEGIN
	
	IF (NEW.part= OLD.part) THEN
		UPDATE t_t SET	part	=NEW.part
				,t_id	=NEW.t_id
				,fld = 	NEW.fld
		WHERE 	
			t_t.part	=NEW.part
			AND t_t.t_id	=NEW.t_id;
	ELSE
		DELETE FROM t_t WHERE t_id = OLD.t_id;
		INSERT INTO t VALUES (NEW.*);
	END IF;
	RETURN NEW; -- RETURN NEW in this case, typically you'd return NULL from this trigger, but for views we return NEW
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER upd
INSTEAD OF UPDATE ON t
FOR EACH ROW EXECUTE PROCEDURE part_update_trigger(); -- create "INSTEAD OF" trigger


INSERT INTO t (part,fld) SELECT  g%2+1 , chr(32 + g%500) FROM generate_series(1,201000) g;




merge append not nullable
if not nullable
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * FROM (
SELECT * FROM t_t 

ORDER BY fld
LIMIT 30 +(SELECT count(1) FROM public.t_t  
	WHERE
		fld = (SELECT fld from (SELECT fld FROM public.t_t ORDER BY 1 LIMIT 30) last ORDER BY fld desc LIMIT 1)
		
	)
) buff
ORDER BY fld,t_id limit 30


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Limit  (cost=2188.53..2188.61 rows=30 width=10) (actual time=1.446..1.458 rows=30 loops=1)
  Output: t_t.part, t_t.t_id, t_t.fld
  Buffers: shared hit=452
  ->  Sort  (cost=2188.53..2238.78 rows=20100 width=10) (actual time=1.445..1.454 rows=30 loops=1)
        Output: t_t.part, t_t.t_id, t_t.fld
        Sort Key: t_t.fld, t_t.t_id
        Sort Method: top-N heapsort  Memory: 26kB
        Buffers: shared hit=452
        ->  Limit  (cost=35.97..1393.89 rows=20100 width=10) (actual time=0.379..1.109 rows=432 loops=1)
              Output: t_t.part, t_t.t_id, t_t.fld
              Buffers: shared hit=452
              InitPlan 2 (returns $1)
                ->  Aggregate  (cost=35.23..35.24 rows=1 width=8) (actual time=0.358..0.358 rows=1 loops=1)
                      Output: count(1)
                      Buffers: shared hit=13
                      InitPlan 1 (returns $0)
                        ->  Limit  (cost=2.56..2.56 rows=1 width=2) (actual time=0.084..0.084 rows=1 loops=1)
                              Output: t_t_1.fld
                              Buffers: shared hit=7
                              ->  Sort  (cost=2.56..2.64 rows=30 width=2) (actual time=0.084..0.084 rows=1 loops=1)
                                    Output: t_t_1.fld
                                    Sort Key: t_t_1.fld DESC
                                    Sort Method: top-N heapsort  Memory: 25kB
                                    Buffers: shared hit=7
                                    ->  Limit  (cost=0.73..2.11 rows=30 width=2) (actual time=0.047..0.066 rows=30 loops=1)
                                          Output: t_t_1.fld
                                          Buffers: shared hit=7
                                          ->  Merge Append  (cost=0.73..9228.04 rows=201001 width=2) (actual time=0.046..0.062 rows=30 loops=1)
                                                Sort Key: t_t_1.fld
                                                Buffers: shared hit=7
                                                ->  Index Only Scan using t_t_fld_idx on public.t_t t_t_1  (cost=0.12..8.14 rows=1 width=32) (actual time=0.003..0.003 rows=0 loops=1)
                                                      Output: t_t_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=1
                                                ->  Index Only Scan using t_1_fld_idx on public.t_1 t_1_1  (cost=0.29..2755.79 rows=100500 width=2) (actual time=0.019..0.023 rows=30 loops=1)
                                                      Output: t_1_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=3
                                                ->  Index Only Scan using t_2_fld_idx on public.t_2 t_2_1  (cost=0.29..2775.79 rows=100500 width=2) (actual time=0.018..0.018 rows=1 loops=1)
                                                      Output: t_2_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=3
                      ->  Append  (cost=0.00..30.66 rows=805 width=0) (actual time=0.135..0.294 rows=402 loops=1)
                            Buffers: shared hit=13
                            ->  Seq Scan on public.t_t t_t_2  (cost=0.00..0.00 rows=1 width=0) (actual time=0.003..0.003 rows=0 loops=1)
                                  Filter: (t_t_2.fld = $0)
                            ->  Index Only Scan using t_1_fld_idx on public.t_1 t_1_2  (cost=0.29..15.33 rows=402 width=0) (actual time=0.132..0.214 rows=402 loops=1)
                                  Index Cond: (t_1_2.fld = $0)
                                  Heap Fetches: 0
                                  Buffers: shared hit=11
                            ->  Index Only Scan using t_2_fld_idx on public.t_2 t_2_2  (cost=0.29..15.33 rows=402 width=0) (actual time=0.015..0.015 rows=0 loops=1)
                                  Index Cond: (t_2_2.fld = $0)
                                  Heap Fetches: 0
                                  Buffers: shared hit=2
              ->  Merge Append  (cost=0.73..13579.97 rows=201001 width=10) (actual time=0.018..0.686 rows=432 loops=1)
                    Sort Key: t_t.fld
                    Buffers: shared hit=439
                    ->  Index Scan using t_t_fld_idx on public.t_t  (cost=0.12..8.14 rows=1 width=40) (actual time=0.002..0.002 rows=0 loops=1)
                          Output: t_t.part, t_t.t_id, t_t.fld
                          Buffers: shared hit=1
                    ->  Index Scan using t_1_fld_idx on public.t_1  (cost=0.29..4931.73 rows=100500 width=10) (actual time=0.007..0.520 rows=432 loops=1)
                          Output: t_1.part, t_1.t_id, t_1.fld
                          Buffers: shared hit=435
                    ->  Index Scan using t_2_fld_idx on public.t_2  (cost=0.29..4951.78 rows=100500 width=10) (actual time=0.007..0.007 rows=1 loops=1)
                          Output: t_2.part, t_2.t_id, t_2.fld
                          Buffers: shared hit=3
Planning time: 0.544 ms
Execution time: 1.611 ms





merge append nullable
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT * FROM (
SELECT * FROM t_t 

ORDER BY fld
LIMIT 30 +(SELECT count(1) FROM public.t_t  
	WHERE
		fld = (SELECT fld from (SELECT fld FROM public.t_t ORDER BY 1 LIMIT 30) last ORDER BY fld desc LIMIT 1)
		OR ( fld IS NULL AND (SELECT fld from (SELECT fld FROM public.t_t ORDER BY 1 LIMIT 30) last ORDER BY fld desc LIMIT 1)
			IS NULL
		)
	)
) buff
ORDER BY fld,t_id limit 30


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
Limit  (cost=3257.31..3257.39 rows=30 width=10) (actual time=2.171..2.178 rows=30 loops=1)
  Output: t_t.part, t_t.t_id, t_t.fld
  Buffers: shared hit=857
  ->  Sort  (cost=3257.31..3307.56 rows=20100 width=10) (actual time=2.169..2.173 rows=30 loops=1)
        Output: t_t.part, t_t.t_id, t_t.fld
        Sort Key: t_t.fld, t_t.t_id
        Sort Method: top-N heapsort  Memory: 26kB
        Buffers: shared hit=857
        ->  Limit  (cost=1104.75..2462.67 rows=20100 width=10) (actual time=1.199..1.804 rows=432 loops=1)
              Output: t_t.part, t_t.t_id, t_t.fld
              Buffers: shared hit=857
              InitPlan 3 (returns $2)
                ->  Aggregate  (cost=1104.01..1104.02 rows=1 width=8) (actual time=1.177..1.178 rows=1 loops=1)
                      Output: count(1)
                      Buffers: shared hit=418
                      InitPlan 1 (returns $0)
                        ->  Limit  (cost=2.56..2.56 rows=1 width=2) (actual time=0.094..0.094 rows=1 loops=1)
                              Output: t_t_1.fld
                              Buffers: shared hit=7
                              ->  Sort  (cost=2.56..2.64 rows=30 width=2) (actual time=0.093..0.093 rows=1 loops=1)
                                    Output: t_t_1.fld
                                    Sort Key: t_t_1.fld DESC
                                    Sort Method: top-N heapsort  Memory: 25kB
                                    Buffers: shared hit=7
                                    ->  Limit  (cost=0.73..2.11 rows=30 width=2) (actual time=0.052..0.071 rows=30 loops=1)
                                          Output: t_t_1.fld
                                          Buffers: shared hit=7
                                          ->  Merge Append  (cost=0.73..9228.04 rows=201001 width=2) (actual time=0.052..0.066 rows=30 loops=1)
                                                Sort Key: t_t_1.fld
                                                Buffers: shared hit=7
                                                ->  Index Only Scan using t_t_fld_idx on public.t_t t_t_1  (cost=0.12..8.14 rows=1 width=32) (actual time=0.003..0.003 rows=0 loops=1)
                                                      Output: t_t_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=1
                                                ->  Index Only Scan using t_1_fld_idx on public.t_1 t_1_1  (cost=0.29..2755.79 rows=100500 width=2) (actual time=0.023..0.028 rows=30 loops=1)
                                                      Output: t_1_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=3
                                                ->  Index Only Scan using t_2_fld_idx on public.t_2 t_2_1  (cost=0.29..2775.79 rows=100500 width=2) (actual time=0.020..0.020 rows=1 loops=1)
                                                      Output: t_2_1.fld
                                                      Heap Fetches: 0
                                                      Buffers: shared hit=3
                      InitPlan 2 (returns $1)
                        ->  Limit  (cost=2.56..2.56 rows=1 width=2) (never executed)
                              Output: t_t_2.fld
                              ->  Sort  (cost=2.56..2.64 rows=30 width=2) (never executed)
                                    Output: t_t_2.fld
                                    Sort Key: t_t_2.fld DESC
                                    ->  Limit  (cost=0.73..2.11 rows=30 width=2) (never executed)
                                          Output: t_t_2.fld
                                          ->  Merge Append  (cost=0.73..9228.04 rows=201001 width=2) (never executed)
                                                Sort Key: t_t_2.fld
                                                ->  Index Only Scan using t_t_fld_idx on public.t_t t_t_2  (cost=0.12..8.14 rows=1 width=32) (never executed)
                                                      Output: t_t_2.fld
                                                      Heap Fetches: 0
                                                ->  Index Only Scan using t_1_fld_idx on public.t_1 t_1_2  (cost=0.29..2755.79 rows=100500 width=2) (never executed)
                                                      Output: t_1_2.fld
                                                      Heap Fetches: 0
                                                ->  Index Only Scan using t_2_fld_idx on public.t_2 t_2_2  (cost=0.29..2775.79 rows=100500 width=2) (never executed)
                                                      Output: t_2_2.fld
                                                      Heap Fetches: 0
                      ->  Append  (cost=0.00..1096.87 rows=805 width=0) (actual time=0.314..1.095 rows=402 loops=1)
                            Buffers: shared hit=418
                            ->  Seq Scan on public.t_t t_t_3  (cost=0.00..0.00 rows=1 width=0) (actual time=0.002..0.002 rows=0 loops=1)
                                  Filter: ((t_t_3.fld = $0) OR ((t_t_3.fld IS NULL) AND ($1 IS NULL)))
                            ->  Bitmap Heap Scan on public.t_1 t_1_3  (cost=15.81..548.43 rows=402 width=0) (actual time=0.311..0.996 rows=402 loops=1)
                                  Recheck Cond: ((t_1_3.fld = $0) OR (t_1_3.fld IS NULL))
                                  Filter: ((t_1_3.fld = $0) OR ((t_1_3.fld IS NULL) AND ($1 IS NULL)))
                                  Heap Blocks: exact=402
                                  Buffers: shared hit=414
                                  ->  BitmapOr  (cost=15.81..15.81 rows=402 width=0) (actual time=0.226..0.226 rows=0 loops=1)
                                        Buffers: shared hit=12
                                        ->  Bitmap Index Scan on t_1_fld_idx  (cost=0.00..11.31 rows=402 width=0) (actual time=0.221..0.221 rows=402 loops=1)
                                              Index Cond: (t_1_3.fld = $0)
                                              Buffers: shared hit=10
                                        ->  Bitmap Index Scan on t_1_fld_idx  (cost=0.00..4.30 rows=1 width=0) (actual time=0.003..0.003 rows=0 loops=1)
                                              Index Cond: (t_1_3.fld IS NULL)
                                              Buffers: shared hit=2
                            ->  Bitmap Heap Scan on public.t_2 t_2_3  (cost=15.81..548.43 rows=402 width=0) (actual time=0.022..0.022 rows=0 loops=1)
                                  Recheck Cond: ((t_2_3.fld = $0) OR (t_2_3.fld IS NULL))
                                  Filter: ((t_2_3.fld = $0) OR ((t_2_3.fld IS NULL) AND ($1 IS NULL)))
                                  Buffers: shared hit=4
                                  ->  BitmapOr  (cost=15.81..15.81 rows=402 width=0) (actual time=0.021..0.021 rows=0 loops=1)
                                        Buffers: shared hit=4
                                        ->  Bitmap Index Scan on t_2_fld_idx  (cost=0.00..11.31 rows=402 width=0) (actual time=0.018..0.018 rows=0 loops=1)
                                              Index Cond: (t_2_3.fld = $0)
                                              Buffers: shared hit=2
                                        ->  Bitmap Index Scan on t_2_fld_idx  (cost=0.00..4.30 rows=1 width=0) (actual time=0.003..0.003 rows=0 loops=1)
                                              Index Cond: (t_2_3.fld IS NULL)
                                              Buffers: shared hit=2
              ->  Merge Append  (cost=0.73..13579.97 rows=201001 width=10) (actual time=0.017..0.557 rows=432 loops=1)
                    Sort Key: t_t.fld
                    Buffers: shared hit=439
                    ->  Index Scan using t_t_fld_idx on public.t_t  (cost=0.12..8.14 rows=1 width=40) (actual time=0.001..0.001 rows=0 loops=1)
                          Output: t_t.part, t_t.t_id, t_t.fld
                          Buffers: shared hit=1
                    ->  Index Scan using t_1_fld_idx on public.t_1  (cost=0.29..4931.73 rows=100500 width=10) (actual time=0.007..0.387 rows=432 loops=1)
                          Output: t_1.part, t_1.t_id, t_1.fld
                          Buffers: shared hit=435
                    ->  Index Scan using t_2_fld_idx on public.t_2  (cost=0.29..4951.78 rows=100500 width=10) (actual time=0.007..0.007 rows=1 loops=1)
                          Output: t_2.part, t_2.t_id, t_2.fld
                          Buffers: shared hit=3
Planning time: 0.838 ms
Execution time: 2.412 ms





и тд.
можно случай лягушки префикс сорта == префиксу инд-а
или составной nullable префикс сорта == индексу расписать
всё так же
сильно не хватает операторов сравнения в смысле отношения порядка при сортировке
для упрощения записи сравнения. (симметричного "IS" вместо = и т.п.)
"IS DISTINCT FROM" не оператор.
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521392
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Очень полезный пост, спасибо!
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521402
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

"Хм! Грех невелик, зато мудрость какова!"

PS: Действительно интересное решение. Более того пригодное для использования не для партиционирования а для ускорения запросов с ORDER BY a,b при наличии индекса только по а. Записал себе в копилку.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521545
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,qwwq
авторДействительно интересное решение. ORDER BY a,b при наличии индекса только по а. Записал себе в копилку.
тоже записал в копилку

кстати решение полезно если даже есть индекс a,b
а сортировку надо такую a desc, b или а, b desc
только остается разобраться как desc сортировку использовать в способе qwwq -)
...
Рейтинг: 0 / 0
оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
    #39521557
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

это всё работа планировщика
то что такую алгоритмическую мелочь приходится писать руками -- показатель "продвинутости" планировщика
а для хенджоба и ручечек наружу торчит маловато, не говоря о пресловутых "текстпаттернопсах", у которых теоретически внутри порядок свой (отличный от) есть, но наружу его не отдадут. козлы
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация limit по union all (когда лимит нельзя перенести в подзапрос)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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