简单查询返回销售订单,发票等数百万条记录......太慢了

时间:2018-03-18 07:58:34

标签: sql sql-server sql-server-2014 sapb1

我一直在寻找方法来提高读取大量记录的性能而无需编制索引(我的理解是它可能会导致SAP支持问题)。

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

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]

虽然此查询返回了所需的结果,但当我选择较大的日期范围时,性能并不是最佳。

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

尝试将查询拆分为两部分,并将每个部分放在OR中:

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

另请注意使用BETWEEN以获得更清晰的信息。

答案 1 :(得分:0)

我无法知道你的基础模型所以说起来并不容易,但为了加快性能:避免全加入。如果您阅读了一些https://axis.apache.org/axis2/java/core/download.html,您会看到它会选择您传递给它的每一列中的所有行,这在您的情况下很多。

我的建议是在没有FULL JOIN的情况下重写SQL请求,只使用NATURAL和INNER。