powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация SELECT
9 сообщений из 9, страница 1 из 1
оптимизация SELECT
    #33346762
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT *, 
(SELECT fio FROM spr_people a WHERE a.id_people=b.id_people) as fio,
(SELECT sex FROM spr_people a WHERE a.id_people=b.id_people) as sex
FROM gr_graphic b WHERE id_group = 1234 ;

При выполнении данного запроса, для каждой строки результата выполняеся два практически одинаковых подзапроса к таблице spr_people. Они конечно выполняются с использованием индекса, но все же... Можно конечно потом с клиента эти данные получать одним дополнительным запросом, выполняемым для каждой строки, но вряд ли это будет быстрее. Что-нибудь можно сделать для оптимизации ?
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33346788
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете ли привести EXPLAIN ANALYZE для Вашего запроса и вот такого:
Код: plaintext
1.
2.
3.
4.
  SELECT b.*, spr_people.fio, spr_people.sex
  FROM gr_graphic b
  LEFT JOIN spr_people a ON (a.id_people=b.id_people)
  WHERE id_group = 1234 ;
???
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33346936
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN ANALYZE SELECT *,
(SELECT fio FROM spr_people a WHERE a.id_people=b.id_people) as fio,
(SELECT sex FROM spr_people a WHERE a.id_people=b.id_people) as sex
FROM gr_graphic b WHERE id_group = 1234 ;

EXPLAIN ANALYZE SELECT b.*, spr_people.fio, spr_people.sex
FROM gr_graphic b
LEFT JOIN spr_people a ON (a.id_people=b.id_people)
WHERE id_group = 1234 ;

А вот результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
                                                          QUERY PLAN                                                           
-------------------------------------------------------------------------------------------------------------------------------
 Index Scan using gr_graphic_1 on gr_graphic b  (cost= 0 . 00 .. 261 . 62  rows= 90  width= 1149 ) (actual time= 0 . 34 .. 0 . 34  rows= 0  loops= 1 )
   Index Cond: (id_group =  1234 )
   SubPlan
     ->  Index Scan using spr_people_1 on spr_people a  (cost= 0 . 00 .. 5 . 60  rows= 1  width= 259 ) (never executed)
           Index Cond: (id_people = $ 0 )
     ->  Index Scan using spr_people_1 on spr_people a  (cost= 0 . 00 .. 5 . 60  rows= 1  width= 4 ) (never executed)
           Index Cond: (id_people = $ 0 )
 Total runtime:  0 . 78  msec
( 8  rows)

                                                                QUERY PLAN                                                                 
-------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost= 327 . 69 .. 30732 . 98  rows= 77136  width= 1416 ) (actual time= 27 . 09 .. 27 . 09  rows= 0  loops= 1 )
   ->  Hash Join  (cost= 327 . 69 .. 591 . 11  rows= 90  width= 1153 ) (actual time= 27 . 08 .. 27 . 08  rows= 0  loops= 1 )
         Hash Cond: ("outer".id_people = "inner".id_people)
         ->  Index Scan using gr_graphic_1 on gr_graphic b  (cost= 0 . 00 .. 261 . 62  rows= 90  width= 1149 ) (actual time= 0 . 26 .. 0 . 26  rows= 0  loops= 1 )
               Index Cond: (id_group =  1234 )
         ->  Hash  (cost= 325 . 55 .. 325 . 55  rows= 855  width= 4 ) (actual time= 26 . 72 .. 26 . 72  rows= 0  loops= 1 )
               ->  Seq Scan on spr_people a  (cost= 0 . 00 .. 325 . 55  rows= 855  width= 4 ) (actual time= 0 . 89 .. 25 . 28  rows= 855  loops= 1 )
   ->  Seq Scan on spr_people  (cost= 0 . 00 .. 325 . 55  rows= 855  width= 263 ) (never executed)
 Total runtime:  27 . 79  msec
( 9  rows)

Видимо первый вариант был лучше.
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33347137
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратите внимание на "never executed" .
Интересно, как будут отличаться для id_group , который есть в таблице?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33348167
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XM, ты имел в виду
Код: plaintext
1.
2.
3.
  SELECT b.*, a.fio, a.sex
  FROM gr_graphic b
  LEFT JOIN spr_people a ON (a.id_people=b.id_people)
  WHERE id_group = 1234 ;
?

Offtopic
ХМ, хотел выразить тебе личную благодарность. Идея аккамулировать результаты в массив - блеск.
:-)
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33348703
reuvenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slava_P
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN ANALYZE SELECT *,
(SELECT fio FROM spr_people a WHERE a.id_people=b.id_people) as fio,
(SELECT sex FROM spr_people a WHERE a.id_people=b.id_people) as sex
FROM gr_graphic b WHERE id_group = 1234 ;

EXPLAIN ANALYZE SELECT b.*, spr_people.fio, spr_people.sex
FROM gr_graphic b
LEFT JOIN spr_people a ON (a.id_people=b.id_people)
WHERE id_group = 1234 ;

А вот результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
                                                          QUERY PLAN                                                           
-------------------------------------------------------------------------------------------------------------------------------
 Index Scan using gr_graphic_1 on gr_graphic b  (cost= 0 . 00 .. 261 . 62  rows= 90  width= 1149 ) (actual time= 0 . 34 .. 0 . 34  rows= 0  loops= 1 )
   Index Cond: (id_group =  1234 )
   SubPlan
     ->  Index Scan using spr_people_1 on spr_people a  (cost= 0 . 00 .. 5 . 60  rows= 1  width= 259 ) (never executed)
           Index Cond: (id_people = $ 0 )
     ->  Index Scan using spr_people_1 on spr_people a  (cost= 0 . 00 .. 5 . 60  rows= 1  width= 4 ) (never executed)
           Index Cond: (id_people = $ 0 )
 Total runtime:  0 . 78  msec
( 8  rows)

                                                                QUERY PLAN                                                                 
-------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost= 327 . 69 .. 30732 . 98  rows= 77136  width= 1416 ) (actual time= 27 . 09 .. 27 . 09  rows= 0  loops= 1 )
   ->  Hash Join  (cost= 327 . 69 .. 591 . 11  rows= 90  width= 1153 ) (actual time= 27 . 08 .. 27 . 08  rows= 0  loops= 1 )
         Hash Cond: ("outer".id_people = "inner".id_people)
         ->  Index Scan using gr_graphic_1 on gr_graphic b  (cost= 0 . 00 .. 261 . 62  rows= 90  width= 1149 ) (actual time= 0 . 26 .. 0 . 26  rows= 0  loops= 1 )
               Index Cond: (id_group =  1234 )
         ->  Hash  (cost= 325 . 55 .. 325 . 55  rows= 855  width= 4 ) (actual time= 26 . 72 .. 26 . 72  rows= 0  loops= 1 )
               ->  Seq Scan on spr_people a  (cost= 0 . 00 .. 325 . 55  rows= 855  width= 4 ) (actual time= 0 . 89 .. 25 . 28  rows= 855  loops= 1 )
   ->  Seq Scan on spr_people  (cost= 0 . 00 .. 325 . 55  rows= 855  width= 263 ) (never executed)
 Total runtime:  27 . 79  msec
( 9  rows)

Видимо первый вариант был лучше.

И записей вернул поменьше
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33349825
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reuvenabИ записей вернул поменьшеОба вернули одинаковое кол-во записей - ноль.

(actual ... rows=0 ...)
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33351426
reuvenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat reuvenabИ записей вернул поменьшеОба вернули одинаковое кол-во записей - ноль.

(actual ... rows=0 ...)

Не, это я так неудачно пошутил насчет результатов EXPLAIN :-)
...
Рейтинг: 0 / 0
оптимизация SELECT
    #33351546
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз показываю:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT b.*,
    a.fio, --!!!!! испольховать алиаз,
    a.sex  --!!!!! а не имя таблицы
FROM gr_graphic b
LEFT JOIN spr_people a --!!!!! ведь алиаз ты ей дал
ON (a.id_people=b.id_people)
WHERE id_group = 1234 ;
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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