Предложение SQL Where значительно увеличивает время запроса - PullRequest
3 голосов
/ 28 мая 2019

У меня есть таблица, с которой я делаю некоторые соединения и операции.Эта таблица содержит около 150 000 строк, и если я выберу все и запусту ее, она вернется через 10 секунд.Если я создаю свой запрос в его собственной таблице и отфильтрую все строки, в которых определенное поле имеет нулевое значение, теперь выполнение запроса занимает 10 минут.Предполагается, что это так или есть способ это исправить?Вот запрос.

SELECT *
FROM
(
    Select 
     I.Date_Created
    ,I.Company_Code
    ,I.Division_Code
    ,I.Invoice_Number
    ,Sh.CUST_PO
    ,I.Total_Quantity
    ,ID.Total
    ,SH.Ship_City City
    ,CASE WHEN SH.Ship_Cntry <> 'US' THEN 'INT' ELSE SH.Ship_prov END State
    ,SH.Ship_Zip Zip
    ,SH.Ship_Cntry Country
    ,S.CustomerEmail
    from [JMNYC-AMTDB].[AMTPLUS].[dbo].Invoices I (nolock)
    LEFT JOIN (SELECT 
                    ID.Company_Code
                    ,ID.Division_Code
                    ,ID.Invoice_Number
                    ,SUM (ID.Price* ID.Quantity) Total
                    FROM [JMNYC-AMTDB].[AMTPLUS].[dbo].Invoices_Detail ID (nolock)
                    GROUP BY ID.Company_Code, ID.Division_Code, ID.Invoice_Number) ID 
            ON I.Company_Code = ID.Company_Code
            AND I.Division_Code = ID.Division_Code
            AND I.Invoice_Number = ID.Invoice_Number
    LEFT JOIN 
        [JMDNJ-ACCELSQL].[A1WAREHOUSE].[dbo].SHIPHIST SH (nolock) ON I.Pickticket_Number = SH.Packslip
    LEFT JOIN 
        [JMDNJ-ACCELSQL].[A1WAREHOUSE].[dbo].[MagentoCustomerEmailData] S on SH.CUST_PO = S.InvoiceNumber

    Where I.Company_Code ='09' AND I.Division_Code = '001'
    AND I.Customer_Number = 'ECOM2X'
    )T
    Where T.CustomerEmail IS NOT NULL -- This is the problematic line
Order By T.Date_Created desc 

1 Ответ

1 голос
/ 29 мая 2019

Если вам известны Замечания по индексам и вы уверены в проблемной точке, то вы можете использовать ее для ее улучшения:

USE A1WAREHOUSE;
GO

CREATE NONCLUSTERED INDEX IX_MagentoCustomerEmailData_CustomerEmail
ON [dbo].[MagentoCustomerEmailData] (CustomerEmail ASC);

GO

В целом вам необходимо добавитьиндекс по столбцам, используемым в разделах ORDER BY, WHERE, GROUP BY, ON и т. д.Перед добавлением индексов убедитесь, что вы знаете о последствиях.

Подробнее об индексе:

  1. https://www.mssqltips.com/sqlservertutorial/9133/sql-server-nonclustered-indexes/
  2. https://www.itprotoday.com/sql-server/indexing-dos-and-don-ts
...