Системные ресурсы MS Access превышены с помощью запроса select

#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. Перепроверьте-как я полагаю, вы не удалили таблицы … происходит что — то еще.