Форум программистов, компьютерный форум, киберфорум
Наши страницы

MS Access

Войти
Регистрация
Восстановить пароль
 
panara
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 11
#1

Оптимизация кода запроса в Access 2010 - MS Access

09.06.2016, 07:02. Просмотров 342. Ответов 2
Метки нет (Все метки)

Есть база данных с таблицей и запросом, запрос вычисляет столбец Difference, но работает очень медленно, если использовать его в большой таблице. Помогите, пожалуйста, оптимизировать код этого запроса:
SQL
1
2
3
4
5
6
7
SELECT П1.Code, П1.Field, П1.Number, П1.Data, [П1].[NUMBER]-(SELECT П3.Number FROM [TABLE] AS П3 
        WHERE П3.Field = П1.Field                                                            
        AND П3.Data = (SELECT MAX(DATA)                                                                           
        FROM [TABLE] AS П2                                                                           
        WHERE П2.Field = П1.Field AND П1.Data > П2.Data)) AS Difference
    FROM [TABLE] AS П1
    ORDER BY П1.Field, П1.Data;
0
Миниатюры
Оптимизация кода запроса в Access 2010  
Вложения
Тип файла: rar Table.rar (22.1 Кб, 7 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2016, 07:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Оптимизация кода запроса в Access 2010 (MS Access):

Excel-Access, оптимизация запроса - MS Access
Доброго времени суток! Просьба помочь с оптимизацией запроса Access-Excel. Код такой работает хорошо: sSql = "SELECT ПОкр FROM...

MS Access 2010: от каких факторов зависит время выполнения запроса? - MS Access
Как уменьшить время выполнения запросов? Может быть железо поменять на более мощное (если мыслить так глобально)?

Перенос старых данных в БД MS Access 2010 из MS Excel 2010 - MS Access
Здравствуйте ! Создаю БД да работы сотрудников. Вроде с основными вопросами справился, но как всегда под конец возникла проблемка. ...

Экспорт данных из Access 2010 в Excel 2010 - MS Access
Добрый день, уважаемые форумчане. Пытаюсь допилить свою базу для работы в мануальной клинике. Почти все сделал, но вот не могу доделать...

Связка Access 2010 и Outlook 2010 - MS Access
Доброго времени уважаемые форумчане есть вот такой код Public Sub Кнопка0_Click() DoCmd.SetWarnings False DoCmd.RunSQL "DELETE...

Оптимизация запроса - Базы данных
Можно ли как-то оптимизировать запрос ? $strSQL = ("SELECT FIO FROM Client WHERE ID = 1 UNION ALL ...

2
ltv_1953
Эксперт MS Access
12736 / 5730 / 1083
Регистрация: 21.06.2012
Сообщений: 10,330
09.06.2016, 07:33 #2
1. Индексы по DATA и FIELD поставьте.
2
mobile
Эксперт MS Access
22432 / 12750 / 2596
Регистрация: 28.04.2012
Сообщений: 13,942
11.06.2016, 05:55 #3
Индексы это безусловно. Но положения не спасет, выигрыш во времени будет непринципиален. Дело в том, что сложность запроса более чем кубическая, что вроде O(4) от количества записей, поскольку в селекте подзапрос который в свою очередь обращается к подзапросу типа нарастающий максимум. А он сам, этот последний подзапрос имеет сложность пропорциональную O(2). Решение может быть прежде всего в изъятии самого внутреннего (и самого тяжелого) подзапроса и замена его на подготовленную заранее вспомогательную таблицу. Тогда вместо О(4) получим О(2)+О(2). И тем самым квадратично уменьшим время.
В предлагаемом варианте создана вспомогательная таблица Temp в которую запросом AddTemp помещаются рассчитанные значения максимальной даты меньше текущей для заданного field. А в запросе CalcQuery, вместо самого внутреннего подзапроса используется поле mData из т.Temp приджойненой к [table].
В таблице показано время расчета в экспериментах на автоматически сгенерированных выборках. На реальных данных время может быть иное - скажется квадратичная зависимость при заполнении Temp
Количество записей Время, сек.
4000.08
10000.3
20001.1
40003.5
1000022.0
2000084.0

Для удобства пользования сделана форма с кнопкой для запуска расчета. Но можно и без формы. Надо последовательно запустить 3 запроса:
1. DeleteTemp
2. AddTemp
3. CalcDiffer

Если у фактической таблицы иное имя и поля иначе называются, то надо исправить запросы AddTemp и CalcDiffer. А также поправить имя таблицы в функции CalcDiff в модуле формы. Строка где надо исправить помечена комментарием.

Запрос1 просто запрос показывающий количество записей в группах по field.
В таблице Temp пустые поля рассчитанной даты заменены #31/12/1899# поскольку с нуллом запрос выходил на ошибку. Вплоть до аварийного выхода из программы.

Тип БД заменен на mdb. Превратить обратно в accdb несложно.
1
Вложения
Тип файла: rar Table.rar (24.7 Кб, 6 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2016, 05:55
Привет! Вот еще темы с ответами:

Код VBA в Access 2010 работает, в Access 2007 выдает ошибку - MS Access
Написала код VBA в Access 2010 - работает, в Access-2007 выдает ошибку. В чем причина - подскажите

Переписывание файла adp под Access 2007 или Access 2010 - MS Access
Имеется проект, разработанный под Access 2003 и работающий с базой данных SQL Server. При запуске проекта под Access 2003 и...

Access 2007 не открывает базу созданную в Access 2010 - MS Access
Access 2007 не открывает базу созданную в Access 2010. Выдает ошибку "Нераспознаваемый формат базы".

Access 2003 и Access 2010 на одном компьютере - MS Access
Возникла необходимость установить Access 2003 и Access 2010 на одном компьютере. В принципе установил, но вот то что каждый раз продукты...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru