2017-02-01 4 views
0

Ich mache einige Performance-Fehlerbehebung für meine native SSRS-Instanz. Ich habe, was ich hoffe, ein einfaches Syntaxproblem. Ich bestimme Ausführungspläne, wenn ich LEFT OUTER JOIN und NOT EXISTS verwende. Ich kenne den Unterschied zwischen den beiden und hoffe, dass vielleicht NICHT EXISTEN meine Lösung ist, aber ich habe ein Problem. Hier ist meine Abfrage.LINKS OUTER JOIN vs NOT EXISTS Syntax mit mehreren Tabellen

SELECT [Facility] 
    ,[CategoryDesc] 
    ,[SubCategoryDesc] 
    ,[ItemKey] 
    ,[ItemDesc] 
    ,[HeadCount] 
    ,[Group] 
    ,[Group Name] 
    ,[CustomerKey] 
    ,[Customer] 
    ,[InvoiceNo] 
    ,[InvoiceDate] 
    ,[OrderNo] 
    ,[OrderDate] 
    ,[FiscalYear] 
    ,[Quarter] 
    ,[WeekNo] 
    ,[SalesmanID] 
    ,[Salesman] 
    ,[ReasonCodeKey] 
    ,[Weight] 
    ,[Box] 
    ,[Value] 
    ,[OrderStatus] 
    ,[PONumber] 
    ,[SubCategoryKey] 
    ,[DispatchCenterOrderKey] 
    ,[PromotionFlag] 
    ,[CategoryKey] 
    ,b.UserID 
FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a 
LEFT OUTER JOIN [FinancialData].[dbo].[DimSalesRepUserIDMap] b on b.SalesRepID = a.SalesmanID 

Ich hoffe, diese stattdessen zu verwenden:

SELECT [Facility] 
    ,[CategoryDesc] 
    ,[SubCategoryDesc] 
    ,[ItemKey] 
    ,[ItemDesc] 
    ,[HeadCount] 
    ,[Group] 
    ,[Group Name] 
    ,[CustomerKey] 
    ,[Customer] 
    ,[InvoiceNo] 
    ,[InvoiceDate] 
    ,[OrderNo] 
    ,[OrderDate] 
    ,[FiscalYear] 
    ,[Quarter] 
    ,[WeekNo] 
    ,[SalesmanID] 
    ,[Salesman] 
    ,[ReasonCodeKey] 
    ,[Weight] 
    ,[Box] 
    ,[Value] 
    ,[OrderStatus] 
    ,[PONumber] 
    ,[SubCategoryKey] 
    ,[DispatchCenterOrderKey] 
    ,[PromotionFlag] 
    ,[CategoryKey] 
    ,b.UserID 
    FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a 
    WHERE NOT EXISTS (SELECT 1 FROM FinancialData.dbo.DimSalesRepUserIDMap b WHERE b.SalesRepID = a.SalesmanID) 

Das Problem ist, dass die letzte Spalte "b.UserID" verwendet JOIN LEFT OUTER es ist alias zu bekommen. Bei Verwendung der letzten Abfrage bekomme ich "die mehrteilige Kennung" b.UserID "konnte nicht gebunden werden. Offensichtlich liegt das daran, dass ich den Aufruf dieser Tabelle entfernt habe. Wenn ich es so einfüge ... dauert es weit zu lang und nicht das, was ich erwarte zu erhalten.

FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a,  FinancialData.dbo.DimSalesRepUserIDMap b 
WHERE NOT EXISTS (SELECT 1 FROM FinancialData.dbo.DimSalesRepUserIDMap b WHERE b.SalesRepID = a.SalesmanID) 

die Frage ist also, wie kann ich dieses Format, so dass ich die Leistung bin Optimierung mit NOT EXISTS oder EXISTS, während auch mehr Spalten aus anderen Tabellen verweisen?

+0

wenn Sie müssen, ich nclude b.UserID dann haben Sie keine andere Wahl als einen Join zu machen. even [FinancialData]. [dbo]. [FactSalesHistoryDetail] a, FinancialData.dbo.DimSalesRepUserIDMap b ist eine ältere Verbindungssyntax. Ich würde vorschlagen, Ihren ursprünglichen LINKEN ÄUSSEREN JOIN zu verwenden und Ausführungsplan zu verwenden, um zu bestimmen, ob Sie irgendwelche Indizes benötigen, die auf den Tisch gelegt werden. Ich denke, SalesRepID muss für beide Tabellen indiziert werden und der Include-Teil des Index sollte die Spalten im SELECT-Teil der Anweisung enthalten. Viel Glück! –

+0

Die Angabe von OUTER nach LINKS ist eine optionale Syntax. Sowohl LINKS als auch LINKS bedeuten dasselbe. – Ethilium

Antwort

0

Links Join ist die beste Option an diesem Punkt.Die letzte Abfrage wird Ergebnisse produzieren, aber haben Auswirkungen auf die Performance.Was haben Sie versucht Cross-Join?

+0

Ich habe nicht, können Sie mir die Syntax für dieses Ajith zeigen? –

Verwandte Themen