MS Access: выполнение запроса занимает много времени - PullRequest
0 голосов
/ 02 марта 2020

tbcurrent содержит 25 тыс. Строк, а tbold содержит более миллиона строк, для которых требуется больше времени. Ниже код работает правильно, но ищет, где я могу его оптимизировать, чтобы он работал быстрее.

(
SELECT
    "Current" as DataFrom,
    a.*
from tbCurrent as a
Inner Join tbOld AS b ON a.Numeric_Inv_No = b.Numeric_Inv_No
    AND a.Amount = b.Amount
    AND a.Vendor_Code <> b.Vendor_Code
Where
    a.Vendor_Code & b.Vendor_Code
    or b.Vendor_Code & a.Vendor_Code in (
    SELECT
        [Vendor A: ID] & [Vendor B: ID] AS MergeB
    FROM tblEXCEPTIONS
    )
UNION ALL
SELECT
    "Old" as DataFrom,
    a1.*
from tbOld as a1
Inner Join tbCurrent AS b1 ON a1.Numeric_Inv_No = b1.Numeric_Inv_No
    AND a1.Amount = b1.Amount   
    AND a1.Vendor_Code <> b1.Vendor_Code
Where
    a1.Vendor_Code & b1.Vendor_Code
    or b1.Vendor_Code & a1.Vendor_Code in (
    SELECT
        [Vendor A: ID] & [Vendor B: ID] AS MergeB
    FROM tblEXCEPTIONS
    )
)
UNION ALL
(
    SELECT
    "Current" as DataFrom,
    a.*
    from tbCurrent as a
    Inner Join tbOld AS b ON a.Numeric_Inv_No = b.Numeric_Inv_No
    AND a.Amount = b.Amount
    AND a.Vendor_Code = b.Vendor_Code
    UNION ALL
    SELECT
    "Old" as DataFrom,
    a1.*
    from tbOld as a1
    Inner Join tbCurrent AS b1 ON a1.Numeric_Inv_No = b1.Numeric_Inv_No
    AND a1.Amount = b1.Amount
    AND a1.Vendor_Code = b1.Vendor_Code
)
ORDER BY
a.Numeric_Inv_No,
DataFrom;

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

При выполнении нескольких операций SELECT, подобных этому UNION, вы можете создавать каждую часть как отдельный запрос. Затем сделайте основной запрос, который объединяет подзапросы. Например:

(SELECT * FROM QueryFirst
UNION ALL
SELECT * FROM QuerySecond)
UNION ALL
(SELECT * FROM QueryThird
UNION ALL
SELECT * FROM QueryFourth);

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

0 голосов
/ 02 марта 2020

как говорится в моем комментарии. Используйте соединение вместо где IN ()

SELECT
    "Current" as DataFrom,
    a.*
from tbCurrent as a
Inner Join tbOld AS b ON a.Numeric_Inv_No = b.Numeric_Inv_No
    AND a.Amount = b.Amount
    AND a.Vendor_Code <> b.Vendor_Code
inner join tblEXCEPTIONS e on e.[Vendor A: ID] = a.Vendor_Code AND e.[Vendor B: ID] = b.Vendor_Code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...