Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2019, 12:55   #1
WeSTMan
Пользователь
 
Регистрация: 11.10.2016
Сообщений: 16
По умолчанию Перехват и изменение запроса SELECT

Добрый день. Есть необходимость перехватить и изменить SQL запрос SELECT в PostgreSQL. Помогите с информацией. TRIGGER не работает на SELECT. Заранее спасибо.
WeSTMan вне форума Ответить с цитированием
Старый 31.10.2019, 14:14   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

зачем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 31.10.2019, 15:05   #3
WeSTMan
Пользователь
 
Регистрация: 11.10.2016
Сообщений: 16
По умолчанию

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

Разница в выполнении
WeSTMan вне форума Ответить с цитированием
Старый 31.10.2019, 15:21   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Серьезно? Не верю. А покажи планы обоих запросов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2019, 17:11   #5
WeSTMan
Пользователь
 
Регистрация: 11.10.2016
Сообщений: 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, то
Код:
"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
WeSTMan вне форума Ответить с цитированием
Старый 31.10.2019, 17:26   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В планах же другие запросы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2019, 17:28   #7
WeSTMan
Пользователь
 
Регистрация: 11.10.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В планах же другие запросы
Суть то одна
WeSTMan вне форума Ответить с цитированием
Старый 31.10.2019, 17:46   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Возможно, но не обязательно. Что мешает в программе код подправить?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.11.2019, 08:41   #9
WeSTMan
Пользователь
 
Регистрация: 11.10.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Возможно, но не обязательно. Что мешает в программе код подправить?
Нет возможности
WeSTMan вне форума Ответить с цитированием
Старый 01.11.2019, 10:33   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В первом запросе distinct скорее всего торчит или group by, а во втором нет. Убери его из первого и планы не должны отличаться. А говоришь суть одна )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерирование формы на основе запроса select user12102018 PHP 0 29.10.2018 23:24
[Delphi 7, BDE]: Как отобразить выборку (результат запроса SELECT) в DBGrid? Вадим Мошев БД в Delphi 5 11.11.2014 14:57
Оптимизация запроса not in (select ... sanich_23 SQL, базы данных 6 07.11.2014 02:56
Перехват запроса в WebBrowser C# bogdanchek C# (си шарп) 1 25.03.2012 23:30
Оптимизиция запроса select ... where ... order by price limit 200 из бд в 18 000 000 записей Lexus_RX_300 SQL, базы данных 2 17.06.2011 12:12