powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация запроса
14 сообщений из 14, страница 1 из 1
Оптимизация запроса
    #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
Оптимизация запроса
    #39867155
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох!!! даже не понял как такая простыня вышла то.... Извините..
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39867157
Применение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39867160
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов АнатолийПрименение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
Да, быстро - секунды 2-3. Но в итоге получается неверно....
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39867161
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если убрать поля, получаемые через IIFы и оставить DISTINCT, то тоже быстро.... Но они нужны(
...
Рейтинг: 0 / 0
Оптимизация запроса
    #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
Оптимизация запроса
    #39867165
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina Ну и сразу виден источник тормозов - это коррелированные подзапросы.
Спасибо!
Akina И, возможно, отсутствие подходящих для связывания индексов.
Все таблицы имеют ключевое поле, связи по этим полям строго.
AkinaПереписывайте подзапросы на джойны.

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

Хватит и первого попавшегося значения...
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39867223
Serg197311Кривцов АнатолийПрименение DISTINCT равноценно группировке по всем полям. Без него должно быть быстрее.
Да, быстро - секунды 2-3. Но в итоге получается неверно.... Неверно, это дублируются записи? Значит у вас присутствует связь многие-ко многим. Ищите причину.
В качестве костыля можно вместо DISTINCT попробовать группировку по основным полям и First по остальным (в первую очередь поля с подзапросами).
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39867264
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311Выполняется секунд 15-20
Можно ли его оптимизировать?У Вас в запросе использовано несколько таблиц-хотелось бы видеть фрагмент БД с этими таблицами(3-5 строками данных) и какую информацию Вы хотите извлечь запросом
...
Рейтинг: 0 / 0
Оптимизация запроса
    #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
Оптимизация запроса
    #39867691
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал внимательно - Кривцов Анатолий именно это тоже советовал. Спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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