Как улучшить производительность внутреннего соединения SQL? - PullRequest
0 голосов
/ 06 ноября 2018

Как улучшить производительность этого запроса во второй таблице CustomerAccountBrand внутреннее объединение занимает много времени. Я добавил некластеризованный индекс, который не используется. Это разделить два внутренних соединения после того, как это в состоянии сцепить? Пожалуйста, помогите получить эти данные.

SELECT DISTINCT 
    RA.AccountNumber, 
    RA.ShipTo,
    RA.SystemCode,
    CAB.BrandCode
FROM dbo.CustomerAccountRelatedAccounts RA  -- Views
INNER JOIN dbo.CustomerAccount CA
    ON RA.RelatedAccountNumber = CA.AccountNumber
    AND RA.RelatedShipTo = CA.ShipTo
    AND RA.RelatedSystemCode = CA.SystemCode 
INNER JOIN dbo.CustomerAccountBrand CAB   ---- Taking long time 4:30 mins
    ON  CA.AccountNumber = CAB.AccountNumber 
    AND CA.ShipTo = CAB.ShipTo 
    AND CA.SystemCode = CAB.SystemCode

ALTER VIEW [dbo].[CustomerAccountRelatedAccounts]
AS
SELECT        
    ca.AccountNumber, ca.ShipTo, ca.SystemCode, cafg.AccountNumber AS RelatedAccountNumber, cafg.ShipTo AS RelatedShipTo, 
    cafg.SystemCode AS RelatedSystemCode
FROM dbo.CustomerAccount AS ca 
    LEFT OUTER JOIN dbo.CustomerAccount AS cafg 
        ON ca.FinancialGroup = cafg.FinancialGroup 
            AND ca.NationalAccount = cafg.NationalAccount
            AND cafg.IsActive = 1
WHERE CA.IsActive = 1

1 Ответ

0 голосов
/ 06 ноября 2018

По моему опыту, оптимизатор запросов к SQL-серверу часто не может выбрать правильный алгоритм объединения, когда запросы становятся более сложными (например, объединение с вашим представлением означает, что нет индекса, доступного для присоединения). Если это то, что здесь происходит, то легко исправить это добавить подсказку о соединении, чтобы превратить ее в соединение с хеш-кодом:

SELECT DISTINCT 
    RA.AccountNumber, 
    RA.ShipTo,
    RA.SystemCode,
    CAB.BrandCode
FROM dbo.CustomerAccountRelatedAccounts RA  -- Views
INNER JOIN dbo.CustomerAccount CA
    ON RA.RelatedAccountNumber = CA.AccountNumber
    AND RA.RelatedShipTo = CA.ShipTo
    AND RA.RelatedSystemCode = CA.SystemCode 
INNER HASH JOIN dbo.CustomerAccountBrand CAB   ---- Note the "HASH" keyword
    ON  CA.AccountNumber = CAB.AccountNumber 
    AND CA.ShipTo = CAB.ShipTo 
    AND CA.SystemCode = CAB.SystemCode
...