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

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

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

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

PS: я не очень понимаю как cross join можно на inner join заменить без изменения смысла запроса и результатов.
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39883680
_WeSTMan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Перехват и изменение запроса SELECT
    #39883681
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukВ такой постановке вопроса - никак.


а через https://www.postgresql.org/docs/current/rules.html такую задачу не сделать?
сам с этим не сталкивался, тем более в PostgreSQL
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39883728
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Перехват и изменение запроса SELECT
    #39883729
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevMaxim BogukВ такой постановке вопроса - никак.


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

Через Rule подобную замену нельзя сделать потому что она семантику запроса меняет.
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39883751
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Перехват и изменение запроса SELECT
    #39883784
_WeSTMan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин_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
Перехват и изменение запроса SELECT
    #39883795
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_WeSTMan_,

Приведите не только планы, но и запросы. Т.е. полный вывод начиная с EXPLAIN ...
Есть подозрения, что планы от других запросов, в частности в первом плане выполняется сортировка по bid.datefinished, о чем не говорилось.
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39883799
_WeSTMan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов_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
Перехват и изменение запроса SELECT
    #39883805
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_WeSTMan_,

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

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

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

это если условий на join нет.... в вашем случае запросы будут 100% одинаковы и по плану и по результатам...
писать можно и так и эдак как кому нравится
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39883820
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов_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
Перехват и изменение запроса SELECT
    #39883850
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перехват и изменение запроса SELECT
    #39883899
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

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

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

Условие на JOIN есть. Посмотрите, пожалуйста, выше в пример INNER JOIN
...
Рейтинг: 0 / 0
Перехват и изменение запроса SELECT
    #39884013
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Перехват и изменение запроса SELECT
    #39884040
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_WeSTMan_,

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

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

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

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

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

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

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

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

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

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

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

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


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