2013-02-14 10 views
0

У меня есть следующий запросDISTINCT решение Query

SELECT DISTINCT T_Med.Comp, T_Med.ItemID, T_Med.WP, T_Med.DocName, T_Med.TrfCode, 
     T_Med.CatDescr, T_Med.SubCatDescr, T_LKPWP.RuleCode, T_MedWP.RuleCode, 
     T_Med.Group 
FROM (T_Med INNER JOIN T_LKPWP ON (T_Med.DocName=T_LKPWP.SDocName) 
AND (T_Med.[WP]=T_LKPWP.WP)) 
LEFT JOIN T_MedWP ON T_LKPWP.RuleCode=T_MedWP.RuleCode 
WHERE (((T_MedWP.RuleCode) Is Null)); 

Из-за DISTINCT это занимает много времени, чтобы обработать. Как я выяснил, хотя я создал индексы для соответствующих полей, это не помогает врагу DISTINCT. Без DISTINCT же запроса дают результаты менее одной секунды

Здесь T_Med имеет 1070065 записей, T_MedWP имеет 366315 записей и T_LKPWP имеет 55 записей

Есть в любом случае достижения ожидаемых результатов в разных пути. Я попытался создать отдельную таблицу без DISTINCT, даже если бы это заняло много времени.

Цените ваши комментарии

+0

Вы изучили план выполнения запроса? Если да, используются ли новые индексы? –

+0

Привет, Фред, Как получить план выполнения в доступе ms. – shabar

+0

Если вы используете Jet, есть параметр реестра JETSHOWPLAN, который создает файл showplan.out при включении. –

ответ

0
SELECT DISTINCT Comp, ItemID, WP, DocName, TrfCode, 
    CatDescr, SubCatDescr, RuleCode, .RuleCode, 
    Group FROM (

maybe try this... 

SELECT T_Med.Comp, T_Med.ItemID, T_Med.WP, T_Med.DocName, T_Med.TrfCode, 
    T_Med.CatDescr, T_Med.SubCatDescr, T_LKPWP.RuleCode, T_MedWP.RuleCode, 
    T_Med.Group 
    FROM (T_Med INNER JOIN T_LKPWP ON (T_Med.DocName=T_LKPWP.SDocName) 
    AND (T_Med.[WP]=T_LKPWP.WP)) 
    LEFT JOIN T_MedWP ON T_LKPWP.RuleCode=T_MedWP.RuleCode 
    WHERE (((T_MedWP.RuleCode) Is Null)); 

) 

также проверить это один Query taking long time with DISTINCT

+0

@ Joe-use ctrl + K для ввода кода. – Art

+0

Thax Joe, я попробовал данную опцию. Все еще находят ту же проблему. Просто интересно, сколько записей будет там в результате, если в T_Med и 'm' количество дубликатов в таблице T_MedWP есть число «n» . Какие могут быть записи, которые я должен получить при выполнении запроса без вывода DISTINCT. Потому что даже если я иду за count(), он не выдаёт put (работает в течение длительного времени) Как я могу решить эту проблему – shabar

0

Это общий пример Oracle, но, возможно, это дает вам некоторое представление. Мне мало что известно о доступе, извините. Невозможно убедиться, что в Access доступны операторы как существующие.

-- Same as Distinct -- 
SELECT deptno, dname FROM scott.dept D WHERE EXISTS (SELECT 'X' FROM scott.emp E WHERE E.deptno = D.deptno) 
/
+0

Спасибо Art, Можете ли вы объяснить, как я мог применить свой запрос к моему сценарию. Что означает «X» – shabar

+0

@shabar - X - любое значение. Неважно, что выбрать в подзапросе - X, 1 или null. Оператор EXISTS возвращает TRUE, если подзапрос возвращает хотя бы одну строку. Как только первая строка в subq. обнаружил, что он возвращает true и не проверяет дальнейшее возвращение отдельных значений. Чтобы помочь вам с запросом, мне нужны таблицы и некоторое время. Я не могу хрустнуть такие вещи в моем сознании. Идея здесь заключается в том, чтобы показать вам, как избежать различий. Проверяйте свои запросы отдельно, например. удалите соединение и посмотрите, где вам нужно применять различные и как избежать этого и т. д. Упростите, всегда держите его простым. – Art