returns 数百万销售订单、发票等记录的简单查询...太慢了

Simple Query that returns millions of records for sales orders, invoices etc... is too slow

我一直在寻找方法来提高在没有索引的情况下读取大量记录的性能(据我所知,这可能会导致 SAP 支持出现问题)。

我的查询很简单,它必须 return 所有有发票的销售订单和所有独立的订单和发票,因为系统上没有明确的周期。

SELECT    
    T5."CardCode", 
    T5."CardName",
    T4."ItemCode",
    T4."ItemName",
    T1."DocNum",
    T1."DocDate",
    T3."DocNum",
    T3."DocDate",
    T3."DocCur",
    ISNULL(T2."PriceBefDi"*T2."Quantity", 0),
    ISNULL(T2."DiscPrcnt", 0),
    ISNULL(T2."LineTotal", 0),
    ISNULL(T2."VatSum", 0),
    ISNULL(T3."DocTotal", 0),
    T2."TaxCode",
    T5."Country"
FROM 
    RDR1 T0 
FULL JOIN 
    ORDR T1 ON T0."DocEntry" = T1."DocEntry"
FULL JOIN 
    INV1 T2 ON T0."DocEntry" = T2."BaseEntry" 
            AND T0."LineNum" = T2."BaseLine" 
            AND T0."ObjType" = T2."BaseType"
FULL JOIN 
    OINV T3 ON T2."DocEntry" = T3."DocEntry"
JOIN
    OITM T4 ON T2."ItemCode" = T4."ItemCode" 
            OR T0."ItemCode" = T4."ItemCode"
JOIN 
    OCRD T5 ON T3."CardCode" = T5."CardCode" 
            OR T1."CardCode" = T5."CardCode"
JOIN 
    OSTC T6 ON T2."TaxCode" = T6."Code" 
            OR T0."TaxCode" = T6."Code"
WHERE 
    T1.[DocDate] >= [%0] 
    AND T1.[DocDate] <= [%1] 
    OR T3.[DocDate] >= [%0] 
    AND T3.[DocDate] <= [%1]

虽然此查询 return 是期望的结果,但当 select 大日期范围时,性能并不是最好的。

我已经做了一些研究,但到目前为止我找到的所有解决方案都不 suitable/applicable 适合我的情况,因为它是一个 SAP 系统,所以我不能乱用标准表。

提前致谢。

我不知道你的基地的型号所以不好说但是,为了加快性能:避免FULL JOIN。如果你读了一些 doc 你会看到它 select 你传递给它的每一列中的所有行,这在你的情况下很多。

我的建议是在不使用 FULL JOIN 的情况下重写 SQL 请求,仅使用 NATURAL 和 INNER 一个。

您应该检查查询计划(由 EXPLAIN 生成),但通常 OR 因不使用索引而臭名昭著。

尝试将查询分成两部分,并将 OR 的每一侧放入每个:

SELECT 
   ...
FROM ...
WHERE T1.[DocDate] BETWEEN [%0] AND [%1]
UNION
SELECT 
   ...
FROM ...
WHERE T3.[DocDate] BETWEEN [%0] AND [%1]

另请注意使用 BETWEEN 以更加清楚。