2015-09-12 2 views
0
SELECT status_master.* 
FROM 100_orders_open 
INNER JOIN status_master 
ON [100_orders_open].OEHISORD_DOC_NO = status_master.OESTATUS_DOC_NO; 

status_master является локальной таблицей с 1,1 миллиона строк.Как ускорить простой SQL запрос в Access

100_orders_open является запросом, который фильтрует локальную таблицу order_master, содержащий 107,441 строк 301 строк.

Запрос занимает 47 секунд на машине с 8-гигабайтным утилизатором. Я не могу улучшить аппаратное обеспечение.

Есть ли способ улучшить выполнение запросов?

ответ

0

Я не уверен, если доступ имеет много оптимизатор запросов, но я думаю, что либо:

SELECT status_master.* 
FROM status_master 
JOIN 100_orders_open 
ON status_master.OESTATUS_DOC_NO = [100_orders_open].OEHISORD_DOC_NO 

или

SELECT * from status_master WHERE status_master.OESTATUS_DOC_NO IN (SELECT [100_orders_open].OEHISORD_DOC_NO from 100_orders_open) 

будет быстрее.

Не знаете, где вы находитесь, но позвольте мне добавить, что индекс, упомянутый кем-то еще ниже, очень важен. Я предположил, что вы уже это знаете, но не должен. Кроме того, я не знаком с Access, но представление 100_orders_open по существу запускает запрос каждый раз, когда он открывается. Что такое SQL для этого представления? Включение того, что необходимо из этого SQL в этот запрос, вероятно, будет намного быстрее.

+0

Хмм, не помогло. – Kashif

+0

Вы только что добавили подзапрос в основной запрос. Я бы подождал OP в этом тесте, но обычно «JOIN» рекомендуется использовать над «IN». И у двигателя Jet/ACE есть [оптимизатор запросов] (http://allenbrowne.com/QueryPerfIssue.html). – Parfait

+0

Это зависит от механизма запроса. Я много работаю в Oracle, и в Oracle второй запрос часто является самой быстрой формой. –

0

Для этого запроса:

SELECT status_master.* 
FROM 100_orders_open INNER JOIN 
    status_master 
    ON [100_orders_open].OEHISORD_DOC_NO = status_master.OESTATUS_DOC_NO; 

Вы хотите индекс на status_master(OESTATUS_DOC_NO). Это должно значительно повысить производительность.

1

Вот несколько стратегий:

  1. Явное выберите поля, необходимые вместо обобщенного *. Возвращение меньшего количества столбцов может повысить производительность.
  2. Поверните 100_orders_open запрос в таблицу temp, чтобы перезапустить другой процесс запроса оптимизатора двигателя ACE. Используйте запрос make-table (SELECT * INTO newtable FROM query). И индекс temp table.
  3. Укажите любое уникальное поле в таблице, особенно в инструкции JOIN (т. Е. OESTATUS_DOC_NO и поле исходной таблицы запроса OEHISORD_DOC_NO).
  4. Разделите большую таблицу в другой файл MS Access и свяжите ее с локальной базой данных, чтобы избежать приближения к пределу 2 ГБ и освободить пространство кеша. В качестве альтернативы можно увеличить до базы данных уровня сервера (т. Е. SQL Server, Oracle, MySQL), если она доступна. Кроме того, MS Access, такой как SQLite, является базой данных на уровне файлов.
1

Вам необходимо построить и объединить другой вид (запрос) в ваш вышеуказанный запрос. Как утверждали другие, столбцы, используемые в этом другом запросе, индексируются, и, конечно же, OESTATUS_DOC_NO также индексируется.

Поскольку вы указываете, что другой запрос возвращает только 300 строк, тогда, если здесь можно использовать индексирование, этот запрос, вероятно, будет выполняться почти мгновенно.

Таким образом, вы должны отбросить запрос по запросу (или просмотреть по представлению), как есть, и попытаться написать запрос в целом - не два отдельных запроса.