Query Optimization - Increasing Estimated Data Size

One of my queries (he used to create a report so that it simply contained: where's, join and group by), returned a timeout after ~ 20 minutes. The proposed execution plan showed me:

fragment1 enter image description here

This Hash Match probably means a group by clause of my request. But what was interesting to me was the approximate data size of ~ 3 TB, which is 10 times the size of my database. After the investigation, I found out the query execution part that significantly increases this data transfer:

fragment2 enter image description here

but these nested loops have any effect on the cost of the request due to the estimated execution plan.

This request is generated by Reporting Services and caught (I delete the unused part):

SET DATEFIRST 7
SELECT
    SUM([f_orders].[LORDEREDQTY_PU]) [QtyPU],
    SUM((((((((([f_orders].[DTRANSFERPRICE] + [f_orders].[DICSBASICORDERFEE]) + [f_orders].[DICSFREIGHTCHARGE]) + [f_orders].[DICSINSURANCEFEE]) + [f_orders].[DICSPACKINGFEE]) + [f_orders].[DICSFREETXTFEE]) + [f_orders].[DICSLOGISTICSFEE]) + [f_orders].[DICSPACKAGEPACKINGFEE]) * [A_ExchangeRates].[USDRate])) [TPinclChargesinUSDBudgetexchangerate],
    [f_orders].[LORDEREDQTY] [TotalQty],
    [dbo_D_ORDERADDRESS].[Countrycode] [Countrycode],
    [D_PRODUCT_NEW].[Framesize] [Framesize],
    [f_orders].[SZCUSSHORTNAME] [Customershortname],
    [f_orders].[SZCUSNO] [Customerno],
    [D_PRODUCT_NEW].[Generationcode] [Generationcode],
    [D_PU].[PU] [PU],
    [D_BALIDINFO].[SRU] [SRU],
    [D_WAREHOUSE].[Warehouse] [Warehouse],
    [f_orders].[DATE_OrderBookedatSU] [OrderbookedatSU],
    [f_orders].[DTCONFIRMEDDEL] [Confirmeddeliverydate],
    [D_PRODUCT_NEW].[MotorsProductType] [MotorsProductType],
    [f_orders].[SZORDERNO] [Orderno],
    [f_orders].[IORDERLINENO] [Orderlineno],
    [D_FRAMESIZE].[Framesize1] [Framesize1],
    [D_PRODGROUP].[Productgroup] [Productgroup],
    [D_PRODTYPE].[Producttype] [Producttype],
    [f_orders].[SZPRODNO] [Productno],
    [D_TYPEOFORDHAND].[Typeoforderhandling] [Typeoforderhandling],
    CASE WHEN COALESCE(LEN([f_orders].[SZVARIANTCODE]), 0) = 0 THEN CAST([f_orders].[IVARIANTCODENO] AS VARCHAR(255)) ELSE [f_orders].[SZVARIANTCODE] END [Variantcodeno],
    [f_orders].[IVARIANTIDX] [Variantindex],
    [f_orders].[DATE_OrderBookedatSU] [OrderbookedatSU1],
    [f_orders].[DATE_OrderBookedatSU] [OrderbookedatSU2]
FROM
[dbo].[f_orders] [f_orders]
LEFT OUTER JOIN (
    SELECT
        [dbo_D_ORDERADDRESS].[SZCOUNTRYCODE] [Countrycode],
        [dbo_D_ORDERADDRESS].[ADDRESS_ORGID] [ADDRESS_ORGID]
    FROM
        (
            SELECT        CAST(1 AS numeric(38)) AS ID, CAST(CVCOUNTRY AS int) AS cvcountry, ADDRESS_ORGID, ORDERLINE_ORGID, ORDER_ORGID, CVADDRESSTYPE, IDWSOURCEID, 
                LORDERID, IORDERLINENO, SZNAME1, SZNAME2, SZNAME3, SZROAD1, SZROAD2, SZROAD3, SZPOSTCODE, SZTOWN, SZPHONE, SZFAX, SZCONTACTPERSON, 
                SZEMAIL, SZVATID, SZINVCUSNO, SZCOUNTRYCODE
            FROM            D_ORDERADDRESS_NEW
        ) [dbo_D_ORDERADDRESS]
) [dbo_D_ORDERADDRESS] ON ([f_orders].[DELADDRESS_ORGID] = [dbo_D_ORDERADDRESS].[ADDRESS_ORGID] OR [f_orders].[DELADDRESS_ORGID] IS NULL AND [dbo_D_ORDERADDRESS].[ADDRESS_ORGID] IS NULL)
LEFT OUTER JOIN (
    SELECT
        [D_FRAMESIZE].[Framesize] [Framesize],
        [D_PRODUCT_NEW].[SZGENCODE] [Generationcode],
        [D_PRODTYPE].[MotorsProductType] [MotorsProductType],
        [D_PRODTYPE].[MotorsProdType] [MotorsProdType],
        [D_PRODUCT_NEW].[DWBOBJECTOID] [DWBOBJECTOID]
    FROM
        [dbo].[D_PRODUCT_NEW] [D_PRODUCT_NEW]
        LEFT OUTER JOIN (
            SELECT
                [D_FRAMESIZE].[DESCRIPTIONEN] [Framesize],
                [D_FRAMESIZE].[VALUE] [VALUE]
            FROM
                [dbo].[D_FRAMESIZE] [D_FRAMESIZE]
        ) [D_FRAMESIZE] ON [D_PRODUCT_NEW].[CVFRAMESIZE] = [D_FRAMESIZE].[VALUE]
        LEFT OUTER JOIN (
            SELECT
                [D_PRODTYPE].[SZMDPRODTYPE] [MotorsProductType],
                [D_PRODTYPE].[SZMDPRODTYPE] [MotorsProdType],
                [D_PRODTYPE].[VALUE] [VALUE]
            FROM
                [dbo].[D_PRODTYPE] [D_PRODTYPE]
        ) [D_PRODTYPE] ON [D_PRODUCT_NEW].[CVPRODTYPE] = [D_PRODTYPE].[VALUE]            
) [D_PRODUCT_NEW] ON ([f_orders].[DWPRDOID] = [D_PRODUCT_NEW].[DWBOBJECTOID] OR [f_orders].[DWPRDOID] IS NULL AND [D_PRODUCT_NEW].[DWBOBJECTOID] IS NULL)  
LEFT OUTER JOIN (
    SELECT
        [D_BALIDINFO].[SZSOPREGION] [SRUSOPRegion],
        [D_BALIDINFO].[SZCOUNTRY] [SRUCountry],
        [D_BALIDINFO].[SZALTERNATEID] [SRU],
        [D_BALIDINFO].[SZALTERNATEID] [SZALTERNATEID],
        [D_BALIDINFO].[SZSOPREGION] [SOPRegion],
        [D_BALIDINFO].[DWBOBJECTOID] [DWBOBJECTOID]
    FROM
        [dbo].[D_BALIDINFO] [D_BALIDINFO]
) [D_BALIDINFO] ON [f_orders].[DWSALESRESPONSIBLEUNITOID] = [D_BALIDINFO].[DWBOBJECTOID]
LEFT OUTER JOIN (
    SELECT
        [D_PU].[DESCRIPTIONEN] [PU],
        [D_PU].[DESCRIPTIONEN] [PU2],
        [D_PU].[VALUE] [VALUE]
    FROM
        [dbo].[D_PU] [D_PU]
) [D_PU] ON [f_orders].[CVPU] = [D_PU].[VALUE]
LEFT OUTER JOIN (
    SELECT
        [D_WAREHOUSE].[DESCRIPTIONEN] [Warehouse],
        [D_WAREHOUSE].[DESCRIPTIONEN] [Warehouse2],
        [D_WAREHOUSE].[VALUE] [VALUE]
    FROM
        [dbo].[D_WAREHOUSE] [D_WAREHOUSE]
) [D_WAREHOUSE] ON [f_orders].[CVWAREHOUSEID] = [D_WAREHOUSE].[VALUE]
LEFT OUTER JOIN (
    SELECT
        [D_FRAMESIZE].[DESCRIPTIONEN] [Framesize1],
        [D_FRAMESIZE].[DESCRIPTIONEN] [FrameSize],
        [D_FRAMESIZE].[VALUE] [VALUE]
    FROM
        [dbo].[D_FRAMESIZE] [D_FRAMESIZE]
) [D_FRAMESIZE] ON [f_orders].[CVFRAMESIZE] = [D_FRAMESIZE].[VALUE]

LEFT OUTER JOIN (
    SELECT
        [D_PRODGROUP].[DESCRIPTIONEN] [Productgroup],
        [D_PRODGROUP].[DESCRIPTIONEN] [ProductGroup2],
        [D_PRODGROUP].[VALUE] [VALUE]
    FROM
        [dbo].[D_PRODGROUP] [D_PRODGROUP]
) [D_PRODGROUP] ON [f_orders].[CVPRODGROUP] = [D_PRODGROUP].[VALUE]
LEFT OUTER JOIN (
    SELECT
        [D_PRODTYPE].[DESCRIPTIONEN] [Producttype],
        [D_PRODTYPE].[DESCRIPTIONEN] [ProductType2],
        [D_PRODTYPE].[VALUE] [VALUE]
    FROM
        [dbo].[D_PRODTYPE] [D_PRODTYPE]
) [D_PRODTYPE] ON [f_orders].[CVPRODTYPE] = [D_PRODTYPE].[VALUE]
INNER JOIN (
    SELECT
        [S_SECURITY].[Login_Name] [LoginName],
        [S_SECURITY].[Security_ID] [Security_ID]
    FROM
        [dbo].[S_SECURITY] [S_SECURITY]
) [S_SECURITY] ON [f_orders].[SECURITY_ID2] = [S_SECURITY].[Security_ID]
LEFT OUTER JOIN (
    SELECT
        [D_ORDERTYPE].[DESCRIPTIONEN] [OrderType],
        [D_ORDERTYPE].[VALUE] [VALUE]
    FROM
        [dbo].[D_ORDERTYPE] [D_ORDERTYPE]
) [D_ORDERTYPE] ON [f_orders].[CVORDERTYPE] = [D_ORDERTYPE].[VALUE]
LEFT OUTER JOIN (
    SELECT
        [D_LINEORDERTYPE].[DESCRIPTIONEN] [LineOrderType],
        [D_LINEORDERTYPE].[VALUE] [VALUE]
    FROM
        [dbo].[D_LINEORDERTYPE] [D_LINEORDERTYPE]
) [D_LINEORDERTYPE] ON [f_orders].[CVLINEORDERTYPE] = [D_LINEORDERTYPE].[VALUE]
LEFT OUTER JOIN (
    SELECT
        [A_ExchangeRates].[USDRate] [USDRate],
        [A_ExchangeRates].[CVCurrency] [CVCurrency],
        [A_ExchangeRates].[RateDate] [RateDate]
    FROM
        [dbo].[A_ExchangeRates] [A_ExchangeRates]
) [A_ExchangeRates] ON [f_orders].[CVCURRENCY] = [A_ExchangeRates].[CVCurrency] AND [f_orders].[DATE_OrderBookedatSU] = [A_ExchangeRates].[RateDate]
LEFT OUTER JOIN (
    SELECT
        [D_TYPEOFORDHAND].[DESCRIPTIONEN] [Typeoforderhandling],
        [D_TYPEOFORDHAND].[VALUE] [VALUE]
    FROM
        [dbo].[D_TYPEOFORDHAND] [D_TYPEOFORDHAND]
) [D_TYPEOFORDHAND] ON [f_orders].[CVTYPEOFORDHAND] = [D_TYPEOFORDHAND].[VALUE]
    GROUP BY
[f_orders].[LORDEREDQTY], [dbo_D_ORDERADDRESS].[Countrycode], [D_PRODUCT_NEW].[Framesize],  
[f_orders].[SZCUSSHORTNAME], [f_orders].[SZCUSNO], [D_PRODUCT_NEW].[Generationcode],  
[D_BALIDINFO].[SRUSOPRegion], [D_BALIDINFO].[SRUCountry], [D_PU].[PU], [D_BALIDINFO].[SRU], [D_WAREHOUSE].[Warehouse], [f_orders].[DATE_OrderBookedatSU], [f_orders].[DTCONFIRMEDDEL], 
[D_PRODUCT_NEW].[MotorsProductType], [f_orders].[SZORDERNO], [f_orders].[IORDERLINENO], [D_FRAMESIZE].[Framesize1], 
    [D_PRODGROUP].[Productgroup], [D_PRODTYPE].[Producttype], [f_orders].[SZPRODNO],
    CASE WHEN COALESCE(LEN([f_orders].[SZVARIANTCODE]), 0) = 0 THEN CAST([f_orders].[IVARIANTCODENO] AS VARCHAR(255)) ELSE [f_orders].[SZVARIANTCODE] END,
    [f_orders].[IVARIANTIDX], [f_orders].[DATE_OrderBookedatSU], [f_orders].[DATE_OrderBookedatSU], D_TYPEOFORDHAND.Typeoforderhandling

1. ?

2. 20 , , -, . -?

+4
1

ok , , , , , , , . , , . f_orders .

+1

Source: https://habr.com/ru/post/1616494/


All Articles