2013-04-15 4 views
0

Ищете предложения по ускорению запроса. Access 2007. Внутренний запрос занимает несколько минут, полный запрос занимает очень много времени (40 - 80 минут). Результат такой же, как ожидалось. Все индексируется.Улучшение в SQL Query - Complex Join/IN/Exists

SELECT qtdetails.F5, qtdetails.F16, ExpectedResult.DLID, ExpectedResult.NumRows 
FROM qtdetails 
INNER JOIN (INVDL 
      INNER JOIN ExpectedResult 
        ON INVDL.DLID = ExpectedResult.DLID) 
     ON (qtdetails.F1 = INVDL.RegionCode) 
      AND (qtdetails.RoundTotal = ExpectedResult.RoundTotal) 
WHERE 
     (qtdetails.F5 IN (SELECT qtdetails.F5 
          FROM (ExpectedResult 
            INNER JOIN INVDL 
              ON ExpectedResult.DLID = INVDL.DLID) 
          INNER JOIN qtdetails 
            ON (INVDL.RegionCode = qtdetails.F1) 
             AND (ExpectedResult.RoundTotal = qtdetails.RoundTotal) 

          GROUP BY qtdetails.F5 
          HAVING (((COUNT(ExpectedResult.DLID)) < 2)); 
          ) 
     ); 

INVDL - 80000 записей

ExpectedResult - десять миллионов записей

qtDetails - 12000 записей

Внутренний запрос приведет около 5000 - 8000 записей. Попробовал сохранить результаты Внутреннего запроса в таблице. а затем с помощью Выберите F5 из qTempTable. Но все еще занимает много времени.

Любая помощь будет очень высоко оценена.

Тип данных:

qtdetails.F5 = Number 
qtdetails.F16 = Text 
ExpectedResult.NumRows = Number 
INVDL.DLID = Number 
ExpectedResult.DLID = Number 
INVDL.RegionCode = Text 
qtdetails.F1 = Text 
+0

Чтобы получить какую-либо фактическую помощь такого рода, рекомендуется также предоставить план 'EXPLAIN' (в основном, как все РСУБД решают, как искать вещи). Как минимум, зная, какие индексы у вас есть, требуется. Как долго длится? И если ваш неожиданный результат - 10 мил строк, то ** переходить ** на некоторое время. –

+0

@ Clockwork-Muse Я проиндексировал все столбцы, участвующие в соединениях. Интересно, поможет ли конвертация «IN» в объединение. Да «ExpectedResult» будет большим, его ожидаем. Использование Access - EXPLAIN можно использовать здесь? – arcotenterprises

+0

Не могли бы вы предоставить дополнительную информацию здесь? Каковы типы столбцов в каждой из трех таблиц? Как они сопоставляются друг с другом (от 1 до 1, от 1 до многих и т. Д.)? Было бы полезно также небольшое подмножество выборочных данных, чтобы увидеть, как все сочетается. – John

ответ

0

Перестроить индексы всех таблиц, участвующих в запросе. Запустите запрос еще раз и проверьте время. Это уменьшит время выполнения. В ближайшее время я обновлю вам настроенный запрос.

Храните запрос!

+0

вы можете предоставить простой код для восстановления индексов существующих таблиц из VBA. – arcotenterprises

+0

Синтаксис для восстановления индекса - «ALTER INDEX REBUILD;». Вы можете выбрать такие индексы - выберите index_name из user_indexes, где table_name в ('table1', 'table2'); – vivek