#sql #ms-access
Вопрос:
Я видел, как этот вопрос задавали здесь несколько раз, но ни один из них, который я видел, не касался моей конкретной проблемы. У меня есть запрос select, который извлекается из 2 связанных таблиц. Когда я запускаю запрос примерно через 5 минут, я получаю сообщение об ошибке «Превышены системные ресурсы». Есть идеи, как я могу это исправить? Ниже приведен мой запрос, две таблицы довольно большие: 146 тыс. строк и 24 столбца в одной и 312 тыс. строк и 67 столбцов в другой. Это просто слишком много данных для доступа?
SELECT [Learner Name]=[learning item number] AS [Key],
Date() AS [Business Day],
[business day] - [updated due date] AS [Days Overdue],
Iif([days overdue] > 0, "true", "false") AS [Greater Than Zero],
assignments.[standard id],
assignments.[learner name],
[email] AS [Email Address],
active_workforce.employee_status,
active_workforce.employee_type,
active_workforce. [bank title desc],
assignments.[learning item number],
assignments.[learning item name],
assignments.[learning item type],
assignments.[enrollment record status],
assignments.[enrollment record substatus],
assignments.[enrollment type],
assignments.[enrolled on date],
assignments.[due date],
Iif([due date] BETWEEN #3 / 16 / 2020 # AND #7 / 31 / 2020 # ,
[due date] 30,
[due date]) AS [Update Due Date],
assignments.[upcoming or overdue],
assignments.[business unit],
assignments.department,
active_workforce.job_code,
assignments.job,
assignments. [legal employer],
assignments.[manager name],
assignments.[manager sid],
assignments. [location name],
assignments.position,
active_workforce.start_dt,
active_workforce.cost_ctr_nbr,
active_workforce.cost_ctr_desc,
active_workforce.city,
active_workforce.country_name,
active_workforce.region_code,
active_workforce.company,
active_workforce.level_02_manager_sid,
active_workforce.level_02_manager,
active_workforce.level_03_manager_sid,
active_workforce.level_03_manager,
active_workforce.level_04_manager_sid,
active_workforce.level_04_manager,
active_workforce.level_05_manager_sid,
active_workforce.level_05_manager,
active_workforce.level_06_manager_sid,
active_workforce.level_06_manager,
active_workforce.level_07_manager_sid,
active_workforce.level_07_manager,
active_workforce.level_08_manager_sid,
active_workforce.level_08_manager,
active_workforce.level_09_manager_sid,
active_workforce.level_09_manager,
active_workforce.level_10_manager_sid,
active_workforce.level_10_manager,
active_workforce.[lob code],
active_workforce.[lob description],
active_workforce.[sub lob code],
active_workforce.[sub lob description],
active_workforce.[level 7 code],
active_workforce.[level 7 description],
active_workforce.[level 8 code],
active_workforce.[level 8 description],
active_workforce.[level 9 code],
active_workforce.[level 9 description],
active_workforce.[level 10 code],
active_workforce.[level 10 description],
active_workforce.[level 11 code],
active_workforce.[level 11 description],
active_workforce.[level 12 code],
active_workforce.[level 12 description],
active_workforce.[level 13 code],
active_workforce.[level 13 description],
active_workforce.[level 14 code],
active_workforce.[level 14 description]
FROM assignments
INNER JOIN active_workforce
ON assignments.[standard id] = active_workforce.sid;
Комментарии:
1. Сделайте компактность и ремонт. — Это должно привести к синтаксической ошибке:
SELECT [Learner Name]=[learning item number] AS [Key]
Ответ №1:
Разбейте этот запрос на несколько более простых и напишите временные таблицы для промежуточных результатов каждого запроса. Объедините данные в конечный результат с помощью одного или нескольких конечных запросов.
На самом деле, этот запрос (после того, как я отформатировал его для облегчения чтения) не кажется таким уж сложным. Проверьте, чтобы убедиться, что на каждой стороне assignments.[standard id] = active_workforce.sid
внутреннего соединения есть индексы. Без индексов Access может пытаться собрать все это в памяти, что звучит слишком много, учитывая ваши заявленные спецификации.
В качестве альтернативы поместите эти данные в экспресс-базу данных SQL Server и позвольте SQL Server обработать их. Но вам все равно понадобятся индексы на assignments.[standard id]
и. active_workforce.sid
Комментарии:
1. К сожалению, у меня нет доступа к SQL Server. Я возвращаюсь в SQL после того, как на некоторое время вышел из него. Что вы имеете в виду под индексами с каждой стороны?
2. Кроме того, это связанные таблицы, поэтому я не верю, что смогу их проиндексировать. Возможно, я разорву связь с созданием интерфейса для загрузки
3. Вы можете индексировать
[standard id]
иsid
в серверной (связанной) базе данных.
Ответ №2:
Создайте самый простой запрос для выбора записей:
SELECT
assignments.[standard id]
FROM
assignments
INNER JOIN
active_workforce
ON assignments.[standard id] = active_workforce.sid;
Сохраните это и создайте новый запрос с сохраненным запросом в качестве источника и включите левое внешнее соединение в каждую из таблиц, чтобы извлечь соответствующие поля из них. Проверьте, что это работает.
Наконец, добавьте свои выражения.
Комментарии:
1. Больше не могу даже связать одну таблицу. Я продолжаю получать ошибку «Введенное вами выражение относится к объекту, который закрыт или не существует».
2. Перепроверьте-как я полагаю, вы не удалили таблицы … происходит что — то еще.