2010-09-14 2 views
1

Я использую Access 2007. У меня есть запрос, который обращается к таблице с несколькими сотнями тысяч записей в ней, к которой я присоединяюсь к другой таблице через внутреннее соединение на основе двух полей. Поля объединения индексируются в обеих таблицах, а столбец сортировки также индексируется. Когда я запускаю запрос прямо, набор результатов открывается примерно через 2 секунды или меньше. Когда я пытаюсь экспортировать результаты запроса (щелкнув правой кнопкой мыши, «Экспорт» в текст), «Доступ» тратит (довольно буквально) часы на то, что я не знаю, перед тем, как он откроет мастер экспорта. И затем, когда я вношу необходимые изменения в формат (делая его разделителем с табуляцией вместо запятой/цитатой), это еще несколько часов, чтобы изменения произошли, прежде чем я могу нажать кнопку «Начать экспорт», что, конечно, занимает еще несколько часов. В часы, когда он сидит и думает, он удерживает процессор на 50% активности.Производительность экспорта данных MS Access ужасна

Любая идея, что происходит, или как я могу вернуть это в разумную производительность? Я перезагрузился и запустил его без каких-либо других программ, проверил все мои индексы, повторно проверил запрос, снова запустил его (что снова заняло ~ 2 секунды), а затем сразу же повторил попытку экспортировать его (что еще не было Через 30 минут экран мастера появится.

table 1: AP_Open 
ID (primary key) 
Vend_No (indexed, dups) 
Vouch_No 
Vouch_date (indexed, dups) 
a bunch of other stuff 
CompanyCode (indexed, dups) 

table 2: Vendors 
Vend_No (indexed, dups) 
Vend_Name 
a bunch of other stuff 
CompanyCode (indexed, dups) 

query: 
select ap_open.vend_no, ap_open.vouch_no, ap_open.vouch_date, vendors.vend_name (etc--about 40 fields) 
From AP_Open INNER JOIN Vendors ON (AP_Open.companyCode = Vendors.CompanyCode) AND (AP_Open.Vend_No = Vendors.Vend_No) 
ORDER BY AP_Open.Vouch_date; 
+0

Установили ли вы все исправления? Например, http://support.microsoft.com/kb/957690 исправляет медленный экспорт в RTF. Вы можете посмотреть на: http://allenbrowne.com/access2007.html – Fionnuala

+0

Если вы хотите знать, что на самом деле происходит, используйте SHOWPLAN - Google в «Jet SHOWPLAN» для получения инструкций. Это покажет план выполнения оптимизатора запросов. –

+0

Где-то вдоль линии есть какая-то настройка, которая контролирует количество строк, на которые мастер экспорта пытается угадать типы данных столбцов. Похоже, он настроен на просмотр всех строк, а не первых. Я не знаю, где искать это! –

ответ

2

Иногда я нашел добавление к существующей таблице или использование таблицы make из сложного запроса. После того, как вы заселили эту таблицу, экспортируйте ее, это не займет много времени. (Убедитесь, что у вас нет указателей на таблице, которую вы собираетесь заполнить)

+0

Это сработало и для меня. Также обратите внимание, что просто всплывающее окно запроса фактически не запускает весь запрос: вам нужно прокрутить до конца таблицы данных, чтобы заставить его сгенерировать все строки, и это может занять некоторое время. – apenwarr

+0

Спасибо, это сократило время от 5 дней или около того до ночи, по крайней мере. Все еще не взволнованы выступлением, но, по крайней мере, я не буду смотреть, как идут крайние сроки. – Hellion

+0

одной дополнительной скоростью является открытие базы данных в эксклюзивном режиме, а не совместное использование и отсутствие блокировки записи, это может сэкономить еще час или 2 – David

0

Вы пытались использовать VBA или макрос для экспорта запроса? Что нужно помнить, поскольку apenwarr упоминается при открытии запроса, он возвращает только первые несколько страниц и работает в фоновом режиме, чтобы закончить заполнение остальных, но при экспорте он должен сначала запустить весь запрос.

1

Здесь должно быть что-то ТАКОЕ УДИВИТЕЛЬНОЕ. Я могу экспортировать объединенный запрос между 130 000 деталей детали счетов-фактур, связанных с таблицей продуктов, и весь экспорт занимает 2-секундные вершины (скорее всего, меньше).

Здесь вы берете небольшой набор данных, а для нескольких 100 000 записей и запроса, который занимает менее 2 секунд, тогда это займет всего 10 секунд. Несколько тысяч тысяч записей не должны длиться так долго.

Есть ли сеть? Является ли это многопользовательским приложением? Пробовали ли вы постоянное соединение перед запуском этого экспорта (вы можете подделать постоянное соединение, открыв любую связанную таблицу и минимизируя ее, а затем попробуйте экспорт). Стол из нескольких 100 000 записей настолько мал и крошечный, и на самом деле он не должен занимать более 10 секунд. Есть некоторые довольно МАССИВНЫЕ детали, которые не учитываются, например, сеть или что-то еще здесь. Является ли это разделенной базой данных со ссылкой на сеть?

+0

Я знаю, что есть что-то ужасно ужасное, поэтому я отправил. :-) База данных хранится локально на моем жестком диске. У него нет многопользовательских компонентов, я единственный, кто когда-либо открывал его или имел к нему доступ. Таблицы хранятся в текущей базе данных, не связаны с другим файлом Access. Единственное, что я могу думать об этом, может быть одним из факторов, заключается в том, что я недавно не сжал базу данных, и он получил примерно 1,3 ГБ в общем размере. – Hellion

+0

Абсолютно компактный db или создать новые таблицы db и импорта – David

+3

Hum, я бы подумал о создании пустой базы данных и импортировании только двух таблиц + запроса, а затем попробуйте экспортировать из этой новой базы данных. Я бы также подумал, что во время экспорта нажмите вкладку «Дополнительно», а затем «сохраните» спецификацию экспорта. Затем вы можете выполнить запрос docmd.TransferText, который позволит вам указать экспортированный «spec», который вы сохранили (так что вам нужно только один раз настроить экспорт, а затем не ждать, пока появится мастер. Например: docmd. TransferText acImportDelim, "my spec", "myQuery", "c: \ output.txt" –