Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 14 сообщений из 14, страница 1 из 1
26.09.2019, 09:04
    #39867154
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
есть запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT DISTINCT MAIN1.code AS Codm1, MAIN.code AS CODP, vers.code AS codever, vers.vers, MAIN.MARKA, MAIN.fold, MAIN.COMMENT, 
vers.mat1, MAIN1.prod, MAIN1.lev, MAIN1.own, MAIN1.qt, 
IIf(Exists (select tprcs.code from tprcs where tprcs.codever=vers.code),True,False) AS tp, 
IIf(Exists (select spztmp.code from spztmp where spztmp.codm1=main1.code),True,False) AS pn  
FROM tprcs RIGHT JOIN ((MAIN INNER JOIN vers 
ON MAIN.CODE = vers.codem) INNER JOIN MAIN1 
ON vers.code = MAIN1.codever) 
ON tprcs.codever = vers.code  WHERE (((MAIN1.sernn) = " & Me!serc & ")) 
ORDER BY MAIN1.lev, MAIN.MARKA, MAIN1.code;


Выполняется секунд 15-20
Можно ли его оптимизировать?
...
Рейтинг: 0 / 0
26.09.2019, 09:05
    #39867155
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Ох!!! даже не понял как такая простыня вышла то.... Извините..
...
Рейтинг: 0 / 0
26.09.2019, 09:10
    #39867157
Оптимизация запроса
Применение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
...
Рейтинг: 0 / 0
26.09.2019, 09:14
    #39867160
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Кривцов АнатолийПрименение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
Да, быстро - секунды 2-3. Но в итоге получается неверно....
...
Рейтинг: 0 / 0
26.09.2019, 09:16
    #39867161
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Если убрать поля, получаемые через IIFы и оставить DISTINCT, то тоже быстро.... Но они нужны(
...
Рейтинг: 0 / 0
26.09.2019, 09:16
    #39867162
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Serg197311даже не понял как такая простыня вышла то...А не надо спешить - надо пользоваться кнопкой "Просмотр".

Тот же запрос, но форматированный:

Код: 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.
SELECT DISTINCT MAIN1.code AS Codm1, 
                MAIN.code AS CODP, 
                vers.code AS codever, 
                vers.vers, 
                MAIN.MARKA, 
                MAIN.fold, 
                MAIN.COMMENT, 
                vers.mat1, 
                MAIN1.prod, 
                MAIN1.lev, 
                MAIN1.own, 
                MAIN1.qt, 
                IIf(    Exists (    select tprcs.code 
                                    from tprcs 
                                    where tprcs.codever=vers.code),
                        True,
                        False) AS tp, 
                IIf(    Exists (    select spztmp.code 
                                    from spztmp 
                                    where spztmp.codm1=main1.code),
                        True,
                        False) AS pn  
FROM tprcs 
RIGHT JOIN  (   (   MAIN 
                    INNER JOIN vers ON MAIN.CODE = vers.codem
                ) 
                INNER JOIN MAIN1 ON vers.code = MAIN1.codever
            ) ON tprcs.codever = vers.code  
WHERE (((MAIN1.sernn) = " & Me!serc & ")) 
ORDER BY    MAIN1.lev, 
            MAIN.MARKA, 
            MAIN1.code;


Ну и сразу виден источник тормозов - это коррелированные подзапросы. И, возможно, отсутствие подходящих для связывания индексов.

Переписывайте подзапросы на джойны.
Создайте необходимые индексы.
...
Рейтинг: 0 / 0
26.09.2019, 09:21
    #39867165
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Akina Ну и сразу виден источник тормозов - это коррелированные подзапросы.
Спасибо!
Akina И, возможно, отсутствие подходящих для связывания индексов.
Все таблицы имеют ключевое поле, связи по этим полям строго.
AkinaПереписывайте подзапросы на джойны.

Сейчас попробую.....
...
Рейтинг: 0 / 0
26.09.2019, 09:51
    #39867175
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Не получается...
так как запросы
Код: sql
1.
2.
select tprcs.code  from tprcs  where tprcs.codever=vers.code
select spztmp.code  from spztmp  where spztmp.codm1=main1.code


могут возвращать несколько значений....
В итоге записи задваиваются, и дерево не строится....
...
Рейтинг: 0 / 0
26.09.2019, 10:13
    #39867187
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Serg197311запросы ... могут возвращать несколько значений....
В итоге записи задваиваются, и дерево не строится....
Ну собственно для этого придумали GROUP BY.
...
Рейтинг: 0 / 0
26.09.2019, 10:20
    #39867191
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Такой запрос можно переписать так
Serg197311
Код: sql
1.
select TOP 1 1  from tprcs  where tprcs.codever=vers.code

Хватит и первого попавшегося значения...
...
Рейтинг: 0 / 0
26.09.2019, 11:06
    #39867223
Оптимизация запроса
Serg197311Кривцов АнатолийПрименение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
Да, быстро - секунды 2-3. Но в итоге получается неверно.... Неверно, это дублируются записи? Значит у вас присутствует связь многие-ко многим. Ищите причину.
В качестве костыля можно вместо DISTINCT попробовать группировку по основным полям и First по остальным (в первую очередь поля с подзапросами).
...
Рейтинг: 0 / 0
26.09.2019, 12:34
    #39867264
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Serg197311Выполняется секунд 15-20
Можно ли его оптимизировать?У Вас в запросе использовано несколько таблиц-хотелось бы видеть фрагмент БД с этими таблицами(3-5 строками данных) и какую информацию Вы хотите извлечь запросом
...
Рейтинг: 0 / 0
27.09.2019, 07:45
    #39867675
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Сделал по совету Akina

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT MAIN1.code AS Codm1, MAIN.code AS CODP, vers.code AS codever, vers.vers, MAIN.MARKA, MAIN.fold,
 MAIN.COMMENT, vers.mat1, MAIN1.prod, MAIN1.lev, MAIN1.own, MAIN1.qt, First([tprcs]![code]) AS tm, First([spztmp]![code]) AS tp
FROM (tprcs RIGHT JOIN ((MAIN INNER JOIN vers ON MAIN.CODE = vers.codem) INNER JOIN MAIN1 ON vers.code = MAIN1.codever) ON 
tprcs.codever = vers.code) LEFT JOIN spztmp ON MAIN1.code = spztmp.codm1
WHERE (((MAIN1.sernn)=12))
GROUP BY MAIN1.code, MAIN.code, vers.code, vers.vers, MAIN.MARKA, MAIN.fold, MAIN.COMMENT, vers.mat1, MAIN1.prod, MAIN1.lev, 
MAIN1.own, MAIN1.qt, MAIN.MARKA, MAIN1.code
ORDER BY MAIN1.lev, MAIN.MARKA, MAIN1.code;



Раньше запрос выполнялся 25 сек, теперь 1-2.
Вопрос решен! Спасибо!
...
Рейтинг: 0 / 0
27.09.2019, 08:30
    #39867691
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Почитал внимательно - Кривцов Анатолий именно это тоже советовал. Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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