Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,018

Оптимизация запроса

11.12.2025, 15:31. Показов 850. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть такой запрос
Кликните здесь для просмотра всего текста
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
CREATE INDEX temp_t1_idx1 ON temp_t1 USING btree ("Column1","Column2","Column3","Column4","Column5");
CREATE INDEX temp_t1_idx2 ON temp_t1 USING btree ("Column1","Column2","Column3","Column4","Column5","Column6");
CREATE INDEX temp_t1_idx3 ON temp_t1 USING btree ("Column1","Column2","Column3","Column4","Column5","Column7");
 
CREATE INDEX temp_t2_idx1 ON temp_t2 USING btree ("Column1","Column2","Column3","Column4","Column5");
 
CREATE INDEX temp_t3_idx1 ON temp_t3 USING btree ("Column1","Column2","Column3","Column4","Column5","Column6");
 
CREATE INDEX temp_t4_idx1 ON temp_t4 USING btree ("Column1","Column2","Column3","Column4","Column5","Column7");
 
CREATE INDEX temp_t5_idx1 ON temp_t5 USING btree ("Column1","Column2","Column3","Column4","Column5");
 
CREATE INDEX temp_t6_idx1 ON temp_t6 USING btree ("Column1","Column2","Column3","Column4","Column5","Column6");
 
CREATE INDEX temp_t7_idx1 ON temp_t7 USING btree ("Column1","Column2","Column3","Column4","Column5","Column7");
 
SELECT
    t1."Column1"
    ,t1."Column2"
    ,t1."Column3"
    ,t1."Column4"
    ,t1."Column5"
    ,t1."Column6"
    ,t1."Column7"
    ,t1."Column8"
    ,t1."Column9"
    ,t1."Column10"
    ,t1."Column11"
    ,t1."Column12"
    ,t1."Column13"
    ,t1."Column14"
    ,t1."Column15"
    ,t1."Column16"
    ,t1."Column17"
    ,t1."Column18"
    ,t1."Column19"
    ,t1."Column20"
    ,t1."Column21"
    ,t2."Column22"
    ,t3."Column23"
    ,t4."Column24"
    ,t5."Column25"
    ,t6."Column26"
    ,t7."Column27"
FROM
    temp_t1 t1
lef JOIN
    temp_t2 t2
ON
    t2."Column1" = t1."Column1"
    AND
    t2."Column2" = t1."Column2"
    AND
    t2."Column3" = t1."Column3"
    AND
    t2."Column4" = t1."Column4"
    AND
    t2."Column5" = t1."Column5"
lef JOIN
    temp_t3 t3
ON
    t3."Column1" = t1."Column1"
    AND
    t3."Column2" = t1."Column2"
    AND
    t3."Column3" = t1."Column3"
    AND
    t3."Column4" = t1."Column4"
    AND
    t3."Column5" = t1."Column5"
    AND
    t3."Column6" = t1."Column6"
lef JOIN
    temp_t4 t4
    t4."Column1" = t1."Column1"
    AND
    t4."Column2" = t1."Column2"
    AND
    t4."Column3" = t1."Column3"
    AND
    t4."Column4" = t1."Column4"
    AND
    t4."Column5" = t1."Column5"
    AND
    t4."Column7" = t1."Column7"
lef JOIN
    temp_t5 t5
ON
    t5."Column1" = t1."Column1"
    AND
    t5."Column2" = t1."Column2"
    AND
    t5."Column3" = t1."Column3"
    AND
    t5."Column4" = t1."Column4"
    AND
    t5."Column5" = t1."Column5"
lef JOIN
    temp_t6 t6
ON
    t6."Column1" = t1."Column1"
    AND
    t6."Column2" = t1."Column2"
    AND
    t6."Column3" = t1."Column3"
    AND
    t6."Column4" = t1."Column4"
    AND
    t6."Column5" = t1."Column5"
    AND
    t6."Column6" = t1."Column6"
lef JOIN
    temp_t7 t7
    t7."Column1" = t1."Column1"
    AND
    t7."Column2" = t1."Column2"
    AND
    t7."Column3" = t1."Column3"
    AND
    t7."Column4" = t1."Column4"
    AND
    t7."Column5" = t1."Column5"
    AND
    t7."Column7" = t1."Column7"

Очень долгий. Составные индексы btree не помогают.

Оптимизируем. Удаляем предыдущие индексы.
Кликните здесь для просмотра всего текста
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
ALTER TABLE temp_t1 ADD index1 text;
ALTER TABLE temp_t1 ADD index2 text;
ALTER TABLE temp_t1 ADD index3 text;
UPDATE temp_t1 SET index1 = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5");
UPDATE temp_t1 SET index2 = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5",'|',"Column6");
UPDATE temp_t1 SET index3 = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5",'|',"Column7");
--create index temp_t1_idx1 on temp_t1 using btree (index1);
--create index temp_t1_idx2 on temp_t1 using btree (index2);
CREATE INDEX temp_t1_idx3 ON temp_t1 USING btree (index3); --План запроса использует только этот индекс
--create index temp_t1_idx4 on temp_t1 using btree (index1, index2, index3);
 
ALTER TABLE temp_t2 ADD INDEX text;
UPDATE temp_t2 SET INDEX = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5");
 
ALTER TABLE temp_t3 ADD INDEX text;
UPDATE temp_t3 SET INDEX = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5",'|',"Column6");
 
ALTER TABLE temp_t4 ADD INDEX text;
UPDATE temp_t4 SET INDEX = concat("Column1",'|',"Column2",'|',"Column3",'|',"Column4",'|',"Column5",'|',"Column7");
 
SELECT
    t1."Column1"
    ,t1."Column2"
    ,t1."Column3"
    ,t1."Column4"
    ,t1."Column5"
    ,t1."Column6"
    ,t1."Column7"
    ,t1."Column8"
    ,t1."Column9"
    ,t1."Column10"
    ,t1."Column11"
    ,t1."Column12"
    ,t1."Column13"
    ,t1."Column14"
    ,t1."Column15"
    ,t1."Column16"
    ,t1."Column17"
    ,t1."Column18"
    ,t1."Column19"
    ,t1."Column20"
    ,t1."Column21"
    ,t2."Column22"
    ,t3."Column23"
    ,t4."Column24"
    ,t5."Column25"
    ,t6."Column26"
    ,t7."Column27"
FROM
    temp_t1 t1
lef JOIN
    temp_t2 t2
ON
    t2.index = t1.index1
lef JOIN
    temp_t3 t3
ON
    t3.index = t1.index2
lef JOIN
    temp_t4 t4
ON
    t4.index = t1.index3
lef JOIN
    temp_t5 t5
ON
    t5.index = t1.index1
lef JOIN
    temp_t6 t6
ON
    t6.index = t1.index2
lef JOIN
    temp_t7 t7
ON
    t7.index = t1.index3

Стало работать быстрее.

Следует учесть, что поля "Column1", "Column3", "Column4", "Column5" - varchar, "Column2" - date, "Column7" - integer.

1. Оцените решение. Есть что не учитывается?

2. Если использовать hash индексы, то какой вариант лучше использовать для данной задачи?
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
--Вариант 1
CREATE INDEX temp_t1_idx1 ON temp_t1 USING hash (
    ("Column1", "Column2", "Column3", "Column4", "Column5")
);
--Вариант 2
CREATE INDEX temp_t1_idx1 ON temp_t1 USING hash (
    ("Column1" || '|' || "Column2" || '|' || "Column3" || '|' || "Column4" || '|' || "Column5")
);
--Вариант 3
CREATE INDEX temp_t1_idx1 ON temp_t1 USING hash (
    (index1)
);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2025, 15:31
Ответы с готовыми решениями:

Оптимизация запроса
Посдчет средней стоимости товара в каждой группе товара (500000 записей в каждой таблице). Select...

Оптимизация запроса.
Здравствуйте! Помогите пожалуйста оптимизировать запрос: SELECT t1.requestor_id AS id,...

Оптимизация запроса (union)
Есть условие select ... where <условие1> or <условие2> . Будет ли это оптимизацией, если запрос...

8
5 / 5 / 0
Регистрация: 21.08.2025
Сообщений: 16
11.12.2025, 21:02
Добрый день.

В первом запросе, связка temp_t1 и temp_t2 по указанным условиям даёт одну запись temp_t1 для каждой из temp_t2 или могут быть дубликаты?
Тот же вопрос по temp_t3, temp_t4, temp_t5, temp_t6 и temp_t7?
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,018
12.12.2025, 08:43  [ТС]
Дубликатов нет
0
5 / 5 / 0
Регистрация: 21.08.2025
Сообщений: 16
12.12.2025, 09:09
Добрый день.

Попробуйте в первом варианте заменить
SQL
1
2
3
4
5
6
7
8
9
10
11
12
lef JOIN
    temp_t2 t2
ON
    t2."Column1" = t1."Column1"
    AND
    t2."Column2" = t1."Column2"
    AND
    t2."Column3" = t1."Column3"
    AND
    t2."Column4" = t1."Column4"
    AND
    t2."Column5" = t1."Column5"
на
SQL
1
2
3
4
5
6
7
 CROSS JOIN lateral (SELECT MAX(tt2."Column22") AS "Column22"
                       FROM temp_t2 tt2
                      WHERE tt2."Column1" = t1."Column1"
                        AND tt2."Column2" = t1."Column2"
                        AND tt2."Column3" = t1."Column3"
                        AND tt2."Column4" = t1."Column4"
                        AND tt2."Column5" = t1."Column5") t2
Другие блоки с left join заменить аналогично.
Свой вариант запроса не пробовал, если есть опечатка синтаксиса, поправте.
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
13.12.2025, 10:49
Вы бы еще планы выполнения прикладывали, от распределения данных по таблицам могут быть совсем разные запросы.

из таблицы temp_t1 выбираются все записи?
0
5 / 5 / 0
Регистрация: 21.08.2025
Сообщений: 16
13.12.2025, 10:57
У первого запроса условий отбора из temp_t1 не вижу.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,018
16.12.2025, 14:17  [ТС]
Цитата Сообщение от UsRomTom Посмотреть сообщение
У первого запроса условий отбора из temp_t1 не вижу.
Там же нет where

А в ON
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM
    temp_t1 t1
lef JOIN
    temp_t2 t2
ON
    t2."Column1" = t1."Column1"
    AND
    t2."Column2" = t1."Column2"
    AND
    t2."Column3" = t1."Column3"
    AND
    t2."Column4" = t1."Column4"
    AND
    t2."Column5" = t1."Column5"
Условия правильные
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 808
16.12.2025, 15:21
Без планов запросов и оценки по количеству строк/их соотношения давать какие либо рекомендации - это тыкать в небо пальцем.
0
5 / 5 / 0
Регистрация: 21.08.2025
Сообщений: 16
16.12.2025, 17:54
Добрый день.

В первом запросе шесть внешних объединений.
Внешние объединения хуже оптимизируются чем внутренние.
Я дал вариант замены внешних на внутренние.
Много раз делал такую замену, время работы запроса многократно уменьшалось.
Ссылка на форум где я предложил аналогичную замену, посмотрите во сколько раз уменьшилось время выполнения и план запроса стал"красивее". Я там ArtToms.
https://resql.ru/forum/topic.p... id=2187185
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2025, 17:54
Помогаю со студенческими работами здесь

Оптимизация запроса. Почему второй запрос работате гораздо быстрее.
Здравствуйте. было выяснено что следующий запрос очень сильно нагружает сервер SELECT tp.* ...

Оптимизация запроса
Доброго времени суток, господа! По работе начал изучать PL/SQL. И в процессе написания одного...

Оптимизация sql-запроса с Count()
Добрый день! Имеется таблица Table1 --id int primary key identity(1,1) --UserIP varchar(15) -...

Оптимизация запроса перестановкой условий OR
Уважаемые, если в выражении WHERE используется конструкция tablename.fieldname_1 = val_1 or ...

Оптимизация запроса
Доброе время суток! Написал я один запрос в оракловскую базу данных на много строк и выполняется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru