Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Перехват и изменение запроса SELECT / 25 сообщений из 26, страница 1 из 2
31.10.2019, 12:50
    #39883551
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Добрый день. Есть необходимость перехватить и изменить SQL запрос SELECT в PostgreSQL. Помогите с информацией. TRIGGER не работает на SELECT. Заранее спасибо.
...
Рейтинг: 0 / 0
31.10.2019, 13:02
    #39883562
DSKalugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Вопрос слишком абстрактный. Приведите реальный пример для чего это нужно. Что вы собираетесь там менять?
...
Рейтинг: 0 / 0
31.10.2019, 13:29
    #39883588
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
DSKaluginВопрос слишком абстрактный. Приведите реальный пример для чего это нужно. Что вы собираетесь там менять?

Есть запрос, который делает CROSS JOIN. Он выполняется ОЧЕНЬ долго. Я хочу его сделать через INNER JOIN, но у меня нет возможности изменять запрос через само ПО. Только СУБД.
...
Рейтинг: 0 / 0
31.10.2019, 14:43
    #39883649
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_DSKaluginВопрос слишком абстрактный. Приведите реальный пример для чего это нужно. Что вы собираетесь там менять?

Есть запрос, который делает CROSS JOIN. Он выполняется ОЧЕНЬ долго. Я хочу его сделать через INNER JOIN, но у меня нет возможности изменять запрос через само ПО. Только СУБД.

В такой постановке вопроса - никак.

PS: я не очень понимаю как cross join можно на inner join заменить без изменения смысла запроса и результатов.
...
Рейтинг: 0 / 0
31.10.2019, 15:04
    #39883680
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Maxim Boguk_WeSTMan_пропущено...


Есть запрос, который делает CROSS JOIN. Он выполняется ОЧЕНЬ долго. Я хочу его сделать через INNER JOIN, но у меня нет возможности изменять запрос через само ПО. Только СУБД.

В такой постановке вопроса - никак.

PS: я не очень понимаю как cross join можно на inner join заменить без изменения смысла запроса и результатов.

Текущий запрос: SELECT id FROM Archive, bid WHERE bid.id = Archive.id; Выполнение 6 сек.
/
Я хочу сделать так: SELECT id FROM Archive INNER JOIN bid ON Archive.id = bid.id; Выполнение 30 мсек.
...
Рейтинг: 0 / 0
31.10.2019, 15:07
    #39883681
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Maxim BogukВ такой постановке вопроса - никак.


а через https://www.postgresql.org/docs/current/rules.html такую задачу не сделать?
сам с этим не сталкивался, тем более в PostgreSQL
...
Рейтинг: 0 / 0
31.10.2019, 16:01
    #39883728
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_Maxim Bogukпропущено...


В такой постановке вопроса - никак.

PS: я не очень понимаю как cross join можно на inner join заменить без изменения смысла запроса и результатов.

Текущий запрос: SELECT id FROM Archive, bid WHERE bid.id = Archive.id; Выполнение 6 сек.
/
Я хочу сделать так: SELECT id FROM Archive INNER JOIN bid ON Archive.id = bid.id; Выполнение 30 мсек.

Эти два запроса эквивалентны для базы в том числе.
Если у вас такая большая разница - приведите результаты explain analyze обоих запросов.
...
Рейтинг: 0 / 0
31.10.2019, 16:03
    #39883729
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Leonid KudryavtsevMaxim BogukВ такой постановке вопроса - никак.


а через https://www.postgresql.org/docs/current/rules.html такую задачу не сделать?
сам с этим не сталкивался, тем более в PostgreSQL

Через Rule подобную замену нельзя сделать потому что она семантику запроса меняет.
...
Рейтинг: 0 / 0
31.10.2019, 16:34
    #39883751
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_Maxim Bogukпропущено...


В такой постановке вопроса - никак.

PS: я не очень понимаю как cross join можно на inner join заменить без изменения смысла запроса и результатов.

Текущий запрос: SELECT id FROM Archive, bid WHERE bid.id = Archive.id; Выполнение 6 сек.
/
Я хочу сделать так: SELECT id FROM Archive INNER JOIN bid ON Archive.id = bid.id; Выполнение 30 мсек.

Вообще-то - это одно и то же.

На чем ваш клиент написан, который выдает этот "неправильный" запрос?
...
Рейтинг: 0 / 0
31.10.2019, 17:14
    #39883784
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Ролг Хупин_WeSTMan_пропущено...


Текущий запрос: SELECT id FROM Archive, bid WHERE bid.id = Archive.id; Выполнение 6 сек.
/
Я хочу сделать так: SELECT id FROM Archive INNER JOIN bid ON Archive.id = bid.id; Выполнение 30 мсек.

Вообще-то - это одно и то же.

На чем ваш клиент написан, который выдает этот "неправильный" запрос?

Анализ запроса с CROSS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
"Limit  (cost=153329.63..153329.66 rows=15 width=243) (actual time=5253.363..5253.374 rows=15 loops=1)"
"  ->  Sort  (cost=153329.63..154848.84 rows=607686 width=243) (actual time=5253.360..5253.364 rows=15 loops=1)"
"        Sort Key: t0.datefinished"
"        Sort Method: top-N heapsort  Memory: 27kB"
"        ->  HashAggregate  (cost=132343.52..138420.38 rows=607686 width=243) (actual time=4180.249..4814.179 rows=956141 loops=1)"
"              Group Key: t0.datefinished, t0.id, t0.assignee, t0.comment, t0.datecreated, t0.declarant, t0.default_max_interval, t0.default_rest_interval, t0.internal_request_id, t0.last_editor, t0.last_task_groups, t0.max_date, t0.processinstanceid, t0.re (...)"
"              ->  Hash Join  (cost=71723.76..97401.58 rows=607686 width=243) (actual time=1738.606..2977.938 rows=972422 loops=1)"
"                    Hash Cond: (t1.bid_id = t0.id)"
"                    ->  Seq Scan on bidworkers t1  (cost=0.00..15945.33 rows=974833 width=8) (actual time=0.016..193.514 rows=974833 loops=1)"
"                    ->  Hash  (cost=63785.24..63785.24 rows=635082 width=243) (actual time=1734.085..1734.085 rows=956518 loops=1)"
"                          Buckets: 1048576  Batches: 1  Memory Usage: 183017kB"
"                          ->  Seq Scan on bid t0  (cost=0.00..63785.24 rows=635082 width=243) (actual time=0.038..898.270 rows=956518 loops=1)"
"                                Filter: ((type = 4) OR (status = 14) OR ((type = 1) AND (status = 8)) OR ((type = 0) AND (status = ANY ('{6,7,13,8}'::integer[]))) OR ((type = 3) AND (status = ANY ('{6,7,8}'::integer[]))) OR ((type = 2) AND (status = ANY (' (...)"
"                                Rows Removed by Filter: 62263"
"Planning time: 0.800 ms"
"Execution time: 5260.637 ms"



Применение INNER
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Limit  (cost=0.85..10.51 rows=15 width=243) (actual time=0.260..0.387 rows=15 loops=1)"
"  ->  Nested Loop  (cost=0.85..391175.57 rows=607686 width=243) (actual time=0.258..0.368 rows=15 loops=1)"
"        ->  Index Scan using datefinished_idx on bid t0  (cost=0.42..84544.96 rows=635082 width=243) (actual time=0.211..0.238 rows=15 loops=1)"
"              Filter: ((type = 4) OR (status = 14) OR ((type = 1) AND (status = 8)) OR ((type = 0) AND (status = ANY ('{6,7,13,8}'::integer[]))) OR ((type = 3) AND (status = ANY ('{6,7,8}'::integer[]))) OR ((type = 2) AND (status = ANY ('{6,9,8}'::integer[ (...)"
"        ->  Index Only Scan using bidworkers_pkey on bidworkers  (cost=0.42..0.47 rows=1 width=8) (actual time=0.006..0.006 rows=1 loops=15)"
"              Index Cond: (bid_id = t0.id)"
"              Heap Fetches: 0"
"Planning time: 0.599 ms"
"Execution time: 0.469 ms"



CROSS делает таблицу x*x, а INNER встраивает.
Если будет 100 записей в одном и 100 в другом, то будет 100*100 при кроссе, а при INNER будет суммарно 100
...
Рейтинг: 0 / 0
31.10.2019, 17:26
    #39883795
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_,

Приведите не только планы, но и запросы. Т.е. полный вывод начиная с EXPLAIN ...
Есть подозрения, что планы от других запросов, в частности в первом плане выполняется сортировка по bid.datefinished, о чем не говорилось.
...
Рейтинг: 0 / 0
31.10.2019, 17:30
    #39883799
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Павел Лузанов_WeSTMan_,

Приведите не только планы, но и запросы. Т.е. полный вывод начиная с EXPLAIN ...
Есть подозрения, что планы от других запросов, в частности в первом плане выполняется сортировка по bid.datefinished, о чем не говорилось.

CROSS запрос
Код: 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.
EXPLAIN ANALYZE SELECT DISTINCT t0.ID AS a1, t0.assignee AS a2, t0.COMMENT AS a3, t0.DATECREATED AS a4, t0.DATEFINISHED AS a5, t0.DECLARANT AS a6, t0.default_max_interval AS a7, t0.default_rest_interval AS a8, t0.internal_request_id AS a9, t0.last_editor AS a10, t0.last_task_groups AS a11, t0.max_date AS a12, t0.PROCESSINSTANCEID AS a13, t0.rest_date AS a14, t0.STATUS AS a15, t0.TAG AS a16, t0.type AS a17, t0.VERSION AS a18, t0.worked_days AS a19, t0.EMPLOYEE_LOGIN AS a20, t0.gid AS a21, t0.PROCEDURE_ID AS a22, t0.PROCEDUREPROCESSDEFINITION_PROCESSDEFINITIONID AS a23
FROM BID t0, bidworkers t1
WHERE (
		(
		(1 = 1) 
			AND (
					(
						(
							(
								(
									(t0.type = 4) OR (t0.STATUS = 14)
								) 
								OR (
									(t0.type = 1) AND (t0.STATUS = 8)
								)
							)
							OR (
								(t0.type = 0) AND (t0.STATUS IN (6,7,13,8))
							)
						) 
						OR (
							(t0.type = 3) AND (t0.STATUS IN (6,7,8))
						)
					) 
					OR (
						(t0.type = 2) AND (t0.STATUS IN (6,9,8))
					)
			)
		)
	 AND (t0.ID = t1.bid_id)) ORDER BY t0.DATEFINISHED ASC LIMIT 15 OFFSET 0;



INNER запрос
Код: 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.
EXPLAIN ANALYZE SELECT t0.ID AS a1, t0.assignee AS a2, t0.COMMENT AS a3, t0.DATECREATED AS a4, t0.DATEFINISHED AS a5, t0.DECLARANT AS a6, t0.default_max_interval AS a7, t0.default_rest_interval AS a8, t0.internal_request_id AS a9, t0.last_editor AS a10, t0.last_task_groups AS a11, t0.max_date AS a12, t0.PROCESSINSTANCEID AS a13, t0.rest_date AS a14, t0.STATUS AS a15, t0.TAG AS a16, t0.type AS a17, t0.VERSION AS a18, t0.worked_days AS a19, t0.EMPLOYEE_LOGIN AS a20, t0.gid AS a21, t0.PROCEDURE_ID AS a22, t0.PROCEDUREPROCESSDEFINITION_PROCESSDEFINITIONID AS a23
FROM BID t0 INNER JOIN bidworkers ON t0.ID = bidworkers.bid_id
WHERE (
		(
		(1 = 1) 
			AND (
					(
						(
							(
								(
									(t0.type = 4) OR (t0.STATUS = 14)
								) 
								OR (
									(t0.type = 1) AND (t0.STATUS = 8)
								)
							)
							OR (
								(t0.type = 0) AND (t0.STATUS IN (6,7,13,8))
							)
						) 
						OR (
							(t0.type = 3) AND (t0.STATUS IN (6,7,8))
						)
					) 
					OR (
						(t0.type = 2) AND (t0.STATUS IN (6,9,8))
					)
			)
		)
	) 
	ORDER BY t0.DATEFINISHED ASC LIMIT 15 OFFSET 0
...
Рейтинг: 0 / 0
31.10.2019, 17:35
    #39883805
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_,

А что делает DISTINCT в первом запросе?
...
Рейтинг: 0 / 0
31.10.2019, 17:38
    #39883808
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Павел Лузанов_WeSTMan_,

А что делает DISTINCT в первом запросе?

Вот да... там разница не в типе JOIN а в наличии/отсутствии DISTINCT.
...
Рейтинг: 0 / 0
31.10.2019, 17:40
    #39883810
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_CROSS делает таблицу x*x, а INNER встраивает.
Если будет 100 записей в одном и 100 в другом, то будет 100*100 при кроссе, а при INNER будет суммарно 100

это если условий на join нет.... в вашем случае запросы будут 100% одинаковы и по плану и по результатам...
писать можно и так и эдак как кому нравится
...
Рейтинг: 0 / 0
31.10.2019, 17:50
    #39883820
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Павел Лузанов_WeSTMan_,

А что делает DISTINCT в первом запросе?


судя по спискам выдачи и сортировки и where

Код: 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.
	t0.ID AS a1
	, t0.assignee AS a2
	, t0.COMMENT AS a3
	, t0.DATECREATED AS a4
	, t0.DATEFINISHED AS a5
	, t0.DECLARANT AS a6
	, t0.default_max_interval AS a7
	, t0.default_rest_interval AS a8
	, t0.internal_request_id AS a9
	, t0.last_editor AS a10
	, t0.last_task_groups AS a11
	, t0.max_date AS a12
	, t0.PROCESSINSTANCEID AS a13
	, t0.rest_date AS a14
	, t0.STATUS AS a15
	, t0.TAG AS a16
	, t0.type AS a17
	, t0.VERSION AS a18
	, t0.worked_days AS a19
	, t0.EMPLOYEE_LOGIN AS a20
	, t0.gid AS a21
	, t0.PROCEDURE_ID AS a22
	, t0.PROCEDUREPROCESSDEFINITION_PROCESSDEFINITIONID AS a23
FROM BID t0
	, bidworkers t1



этот DISTINCT (неудачно) заменяет exists -- на случай множественности со стороны t1 (что судя по пкей на поле связи не соответствует случаю тс)

судя по ["(1=1)" ] там самопальный "движок", аффтар коего упирается его переписывать. и пинает тс-а
...
Рейтинг: 0 / 0
31.10.2019, 18:50
    #39883850
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Maxim BogukЧерез Rule подобную замену нельзя сделать потому что она семантику запроса меняет.
Amazon через pg-bouncer вроде такое делает

https://aws.amazon.com/blogs/big-data/query-routing-and-rewrite-introducing-pgbouncer-rr-for-amazon-redshift-and-postgresql/
...
Рейтинг: 0 / 0
31.10.2019, 20:57
    #39883899
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Leonid Kudryavtsev,

Ну это не совсем то.
Это замена не на сервере бд, а в промежуточном слое.
Предлагается написать питоновскую функцию, которая может заменять текст запроса на любой другой запрос. Но это все происходит до того как запрос попал на сервер.
...
Рейтинг: 0 / 0
01.11.2019, 08:50
    #39883976
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Maxim Boguk_WeSTMan_CROSS делает таблицу x*x, а INNER встраивает.
Если будет 100 записей в одном и 100 в другом, то будет 100*100 при кроссе, а при INNER будет суммарно 100

это если условий на join нет.... в вашем случае запросы будут 100% одинаковы и по плану и по результатам...
писать можно и так и эдак как кому нравится

Условие на JOIN есть. Посмотрите, пожалуйста, выше в пример INNER JOIN
...
Рейтинг: 0 / 0
01.11.2019, 09:50
    #39884013
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_Maxim Bogukпропущено...


это если условий на join нет.... в вашем случае запросы будут 100% одинаковы и по плану и по результатам...
писать можно и так и эдак как кому нравится

Условие на JOIN есть. Посмотрите, пожалуйста, выше в пример INNER JOIN

"а ты упорный, парамоша (сс)"

приведите планы для следующих запросов :
"CROSS запрос"
Код: 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.
EXPLAIN ANALYZE SELECT /*DISTINCT*/ t0.ID AS a1, t0.assignee AS a2, t0.COMMENT AS a3, t0.DATECREATED AS a4, t0.DATEFINISHED AS a5, t0.DECLARANT AS a6, t0.default_max_interval AS a7, t0.default_rest_interval AS a8, t0.internal_request_id AS a9, t0.last_editor AS a10, t0.last_task_groups AS a11, t0.max_date AS a12, t0.PROCESSINSTANCEID AS a13, t0.rest_date AS a14, t0.STATUS AS a15, t0.TAG AS a16, t0.type AS a17, t0.VERSION AS a18, t0.worked_days AS a19, t0.EMPLOYEE_LOGIN AS a20, t0.gid AS a21, t0.PROCEDURE_ID AS a22, t0.PROCEDUREPROCESSDEFINITION_PROCESSDEFINITIONID AS a23
FROM BID t0, bidworkers t1
WHERE (
		(
		(1 = 1) 
			AND (
					(
						(
							(
								(
									(t0.type = 4) OR (t0.STATUS = 14)
								) 
								OR (
									(t0.type = 1) AND (t0.STATUS = 8)
								)
							)
							OR (
								(t0.type = 0) AND (t0.STATUS IN (6,7,13,8))
							)
						) 
						OR (
							(t0.type = 3) AND (t0.STATUS IN (6,7,8))
						)
					) 
					OR (
						(t0.type = 2) AND (t0.STATUS IN (6,9,8))
					)
			)
		)
	 AND (t0.ID = t1.bid_id)) ORDER BY t0.DATEFINISHED ASC LIMIT 15 OFFSET 0;



INNER запрос
Код: 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.
EXPLAIN ANALYZE SELECT DISTINCT t0.ID AS a1, t0.assignee AS a2, t0.COMMENT AS a3, t0.DATECREATED AS a4, t0.DATEFINISHED AS a5, t0.DECLARANT AS a6, t0.default_max_interval AS a7, t0.default_rest_interval AS a8, t0.internal_request_id AS a9, t0.last_editor AS a10, t0.last_task_groups AS a11, t0.max_date AS a12, t0.PROCESSINSTANCEID AS a13, t0.rest_date AS a14, t0.STATUS AS a15, t0.TAG AS a16, t0.type AS a17, t0.VERSION AS a18, t0.worked_days AS a19, t0.EMPLOYEE_LOGIN AS a20, t0.gid AS a21, t0.PROCEDURE_ID AS a22, t0.PROCEDUREPROCESSDEFINITION_PROCESSDEFINITIONID AS a23
FROM BID t0 INNER JOIN bidworkers ON t0.ID = bidworkers.bid_id
WHERE (
		(
		(1 = 1) 
			AND (
					(
						(
							(
								(
									(t0.type = 4) OR (t0.STATUS = 14)
								) 
								OR (
									(t0.type = 1) AND (t0.STATUS = 8)
								)
							)
							OR (
								(t0.type = 0) AND (t0.STATUS IN (6,7,13,8))
							)
						) 
						OR (
							(t0.type = 3) AND (t0.STATUS IN (6,7,8))
						)
					) 
					OR (
						(t0.type = 2) AND (t0.STATUS IN (6,9,8))
					)
			)
		)
	) 
	ORDER BY t0.DATEFINISHED ASC LIMIT 15 OFFSET 0



после чего перечитайте топек
...
Рейтинг: 0 / 0
01.11.2019, 10:23
    #39884040
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_,

вопрос неправильный и отвечают вам неправильно, потому что на неправильный вопрос.
То, что вы хотите сделать, лишено смысла. У каждой программы есть автор (сюрприз) и исходный код (ещё сюрприз).
Вот к автору и обращайтесь за изменением SQL-запроса и, если программа составлена по вашему заказу, то требуйте предоставления исходного кода (это надо сделать ещё до начала работы во избежание препирательств. Но если не сообразили, то препирайтесь).

Сейчас вы можете попытаться ускорить выполнение запроса подбором индексом и/или замены таблицы, к которой он обращается, на view или materialized view. А если вы подберёте более эффективный SQL-запрос, то вместо бессмысленного перехвата прежнего запроса надо изменить программу.
...
Рейтинг: 0 / 0
01.11.2019, 10:26
    #39884043
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Partisan M_WeSTMan_,

вопрос неправильный и отвечают вам неправильно, потому что на неправильный вопрос.
То, что вы хотите сделать, лишено смысла. У каждой программы есть автор (сюрприз) и исходный код (ещё сюрприз).
Вот к автору и обращайтесь за изменением SQL-запроса и, если программа составлена по вашему заказу, то требуйте предоставления исходного кода (это надо сделать ещё до начала работы во избежание препирательств. Но если не сообразили, то препирайтесь).

Сейчас вы можете попытаться ускорить выполнение запроса подбором индексом и/или замены таблицы, к которой он обращается, на view или materialized view. А если вы подберёте более эффективный SQL-запрос, то вместо бессмысленного перехвата прежнего запроса надо изменить программу.
Система писалась давно. Разработчиков уже не существуют. Написано для glassfish. Нашим программистам очень сложно копаться в этом коде и не везде можно переделать SQL запросы. Некоторые сделаны через framework. Ищем решение на стороне БД.
...
Рейтинг: 0 / 0
01.11.2019, 10:55
    #39884074
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_Partisan M_WeSTMan_,

вопрос неправильный и отвечают вам неправильно, потому что на неправильный вопрос.
То, что вы хотите сделать, лишено смысла. У каждой программы есть автор (сюрприз) и исходный код (ещё сюрприз).
Вот к автору и обращайтесь за изменением SQL-запроса и, если программа составлена по вашему заказу, то требуйте предоставления исходного кода (это надо сделать ещё до начала работы во избежание препирательств. Но если не сообразили, то препирайтесь).

Сейчас вы можете попытаться ускорить выполнение запроса подбором индексом и/или замены таблицы, к которой он обращается, на view или materialized view. А если вы подберёте более эффективный SQL-запрос, то вместо бессмысленного перехвата прежнего запроса надо изменить программу.
Система писалась давно. Разработчиков уже не существуют. Написано для glassfish. Нашим программистам очень сложно копаться в этом коде и не везде можно переделать SQL запросы. Некоторые сделаны через framework. Ищем решение на стороне БД.

вы уже проверили планы с реверсом "дистинкта" или нет ?
т.е. уже убедились в бессмысленности своего предприятия ?
(и перестали пить коньяк по утрам ?)

на стороне субд вам надо реализовать аналог луз-индекскана для дистинкт-лимит-а на уровне унутренних алгоритмов оптимизатора постгреса. (что алгоритмически несложно, если иметь в руках что-то типа seek , который обычно можно эмулировать в скл кляузой with recurive с бубнами и джек-потом , но как в общем случае анализировать статистику, чтобы выбрать такой или иной алгоритм -- надо думать , что не является сильной стороной разрабов планировщика пж ) , дабы подавить фатальное влияние DISTINCT на план.

или же достаточно просто выбросить DISTINCT из запроса на стороне приложения. поскольку в данном конкретном случае он похоже не нужен -- в силу констрейнтов на таблицах. а план валит напрочь.
...
Рейтинг: 0 / 0
01.11.2019, 11:14
    #39884097
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
Maxim BogukПавел Лузанов_WeSTMan_,

А что делает DISTINCT в первом запросе?

Вот да... там разница не в типе JOIN а в наличии/отсутствии DISTINCT.
Потерял DISTINCT во втором запросе, извините)
...
Рейтинг: 0 / 0
01.11.2019, 12:53
    #39884206
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват и изменение запроса SELECT
_WeSTMan_,

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


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