Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化SQL Server查询以提高速度_Sql_Sql Server_Tsql_Query Optimization - Fatal编程技术网

优化SQL Server查询以提高速度

优化SQL Server查询以提高速度,sql,sql-server,tsql,query-optimization,Sql,Sql Server,Tsql,Query Optimization,如何优化SQL Server查询?下面是我想要优化的代码 CREATE TABLE #Temp ( TransactionId int PRIMARY KEY, TransactionStepId int ) INSERT INTO #Temp(TransactionId, TransactionStepId) SELECT TransactionId, MAX(TransactionStepId) TransactionStepId FRO

如何优化SQL Server查询?下面是我想要优化的代码

CREATE TABLE #Temp
(
    TransactionId int PRIMARY KEY,
    TransactionStepId int
) 

INSERT INTO #Temp(TransactionId, TransactionStepId)
    SELECT 
        TransactionId, MAX(TransactionStepId) TransactionStepId
    FROM 
        [WarehouseMgmt].[FactPaymentTrans]  FPT
    JOIN 
        WarehouseMgmt.DimTimeZone DTZ on FPT.[TimeId] = DTZ.TimeUTCId   
    WHERE 
        FactType = 'SOURCE' 
        AND (DTZ.TimeId BETWEEN @DimStartDate AND @DimEndDate)
    GROUP BY 
        TransactionId 

IF(UPPER(@ReportBy) = 'TRANSACTION')
BEGIN
SET @sql = '
    INSERT INTO #Results (      
    [PaymentTypeId],
    [TransactionDate],
    [PaymentMethodId],
    [3DSecureId],
    [ProductId],
    [ProductTypeId],
    [TransactionStatusId],
    [Amount],
    [Currency],
    [PlayerId],
    [PlayerSourceOrigId],
    [Username],
    [FirstName],
    [LastName],
    [BrandId],
    [VIPLevelId],
    [MarketingChannelId],
    [MarketingSourceId],
    [CommentId],
    [CommentRefId],
    [AdminName],
    [OriginalTransactionId],
    [TransactionId],
    [RelatedTransactionId],
    [ProviderTransactionOrigId]
    )
    SELECT
        DTST.[Id],
        FPT.[StartTime],
        FPT.[PaymentMethodId],
        FPT.[3DSecureId],
        FPT.[ProductId],
        DPT.[Id],
        FPT.[TransactionStatusId],
        FPT.[Amount],
        FPT.CurrencyId,
        FPT.[PlayerId],
        DPL.[SourceOrigId],
        DPL.[Username],
        DPL.[FirstName],
        DPL.[LastName],
        DPL.[BrandId],
        DPL.[VIPLevelId],
        DPL.[MarketingChannelId],
        DPL.[MarketingSourceId],
        FPT.[PaymentReasonTextId],
        FPT_Ref.[PaymentReasonTextId],
        FPT.CreatedByAdminId,
        FPT.[OriginalTransactionId],
        FPT.[TransactionId],
        FPT_Ref.[OriginalTransactionId],
        FPT.[ProviderTransactionOrigId]
  FROM WarehouseMgmt.FactPaymentTrans AS FPT        
    JOIN #Temp T ON FPT.TransactionId = T.TransactionId AND FPT.TransactionStepId = T.TransactionStepId
    JOIN WarehouseMgmt.DimTransactionStepType AS DTST ON FPT.[TransactionStepTypeId] = DTST.[Id] 
    JOIN WarehouseMgmt.DimPlayer AS DPL ON FPT.PlayerId = DPL.Id
    JOIN WarehouseMgmt.DimProduct AS DP ON DP.Id = FPT.ProductId
    JOIN WarehouseMgmt.DimProductType AS DPT ON DPT.Id = DP.ProductTypeId
    --JOIN WarehouseMgmt.DimTimeZone DTZ on FPT.[TimeId] = DTZ.TimeUTCId
    JOIN [WarehouseMgmt].[DimLoyaltyProgramLevel] DLPL ON DLPL.[Id]=DPL.VipLevelId      
    LEFT JOIN 
  (
              SELECT FPT_Ref_1.TransactionId,FPT_Ref_1.FactType,FPT_Ref_1.OriginalTransactionId,FPT_Ref_1.[PaymentReasonTextId] 
              FROM WarehouseMgmt.FactPaymentTrans AS FPT_Ref_1                         
              JOIN #Temp T ON T.TransactionId = FPT_Ref_1.OriginalTransactionId AND T.TransactionStepId = FPT_Ref_1.TransactionStepId
   ) AS FPT_Ref ON FPT_Ref.OriginalTransactionId = FPT.TransactionId AND FPT_Ref.FactType = ''SOURCE'' 
  WHERE (FPT.FactType = ''SOURCE'')  ' + @sqlFilters
我试着把这个

            SELECT TransactionId,MAX(TransactionStepId) TransactionStepId
            FROM [WarehouseMgmt].[FactPaymentTrans] 
            WHERE FactType = ''SOURCE'' 
            GROUP BY TransactionId 
在临时表中,但这甚至是没有临时表时最糟糕的情况。我想选择最新的TransactionId(由MAX(TransactionStepId)创建),还想选择左侧连接中的最后一个TransactionId

我的执行计划是:


您是否考虑过使用行号而不是两次加入您的表?请尝试以下方法:

;WITH FactPaymentTrans_Last
AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY TransactionID ORDER BY TransactionStepID DESC) AS RN
    FROM WarehouseMgmt.FactPaymentTrans
    )
SELECT DTST.[Id]
    , FPT.[StartTime]
    , FPT.[PaymentMethodId]
    , FPT.[3DSecureId]
    , FPT.[ProductId]
    , DPT.[Id]
    , FPT.[TransactionStatusId]
    , FPT.[Amount]
    , FPT.CurrencyId
    , FPT.[PlayerId]
    , DPL.[SourceOrigId]
    , DPL.[Username]
    , DPL.[FirstName]
    , DPL.[LastName]
    , DPL.[BrandId]
    , DPL.[VIPLevelId]
    , DPL.[MarketingChannelId]
    , DPL.[MarketingSourceId]
    , FPT.[PaymentReasonTextId]
    , FPT_Ref.[PaymentReasonTextId]
    , FPT.CreatedByAdminId
    , FPT.[OriginalTransactionId]
    , FPT.[TransactionId]
    , FPT_Ref.[OriginalTransactionId]
    , FPT.[ProviderTransactionOrigId]
FROM FactPaymentTrans_Last AS FPT
INNER JOIN WarehouseMgmt.DimTransactionStepType AS DTST
    ON FPT.[TransactionStepTypeId] = DTST.[Id]
INNER JOIN WarehouseMgmt.DimPlayer AS DPL
    ON FPT.PlayerId = DPL.Id
INNER JOIN WarehouseMgmt.DimProduct AS DP
    ON DP.Id = FPT.ProductId
WHERE FPT.RN = 1;
这只是一个片段,让您了解如何使用它根据其
TransactionStepId
获取最新的
transactionid

如果还不够,请发布以下内容:

  • 你的桌子结构
  • 关于它们的指数
  • 你的执行计划

  • 这将有助于为您提供建议。

    有多个因素可以提高查询性能,其中一个因素可以做到,而无需了解有关索引、数据库架构、数据分布等的详细信息。这是查询中的
    连接的顺序

    我已经重构了您的查询,我认为您应该得到与以前相同的结果,但执行时间有所缩短:

    SELECT DTST.[Id]
        ,FPT.[StartTime]
        ,FPT.[PaymentMethodId]
        ,FPT.[3DSecureId]
        ,FPT.[ProductId]
        ,DPT.[Id]
        ,FPT.[TransactionStatusId]
        ,FPT.[Amount]
        ,FPT.CurrencyId
        ,FPT.[PlayerId]
        ,DPL.[SourceOrigId]
        ,DPL.[Username]
        ,DPL.[FirstName]
        ,DPL.[LastName]
        ,DPL.[BrandId]
        ,DPL.[VIPLevelId]
        ,DPL.[MarketingChannelId]
        ,DPL.[MarketingSourceId]
        ,FPT.[PaymentReasonTextId]
        ,FPT_Ref.[PaymentReasonTextId]
        ,FPT.CreatedByAdminId
        ,FPT.[OriginalTransactionId]
        ,FPT.[TransactionId]
        ,FPT_Ref.[OriginalTransactionId]
        ,FPT.[ProviderTransactionOrigId]
    FROM WarehouseMgmt.FactPaymentTrans AS FPT
    INNER JOIN WarehouseMgmt.DimPlayer AS DPL
        ON FPT.PlayerId = DPL.Id
    INNER JOIN WarehouseMgmt.DimProduct AS DP
        ON DP.Id = FPT.ProductId
    INNER JOIN WarehouseMgmt.DimProductType AS DPT
        ON DPT.Id = DP.ProductTypeId
    INNER JOIN WarehouseMgmt.DimTransactionStepType AS DTST
        ON FPT.[TransactionStepTypeId] = DTST.[Id]    
    WHERE (FPT.FactType = '' SOURCE '')
        AND EXISTS (SELECT 1
                    FROM [WarehouseMgmt].[FactPaymentTrans]
                    WHERE FactType = '' SOURCE ''
                        AND FPT.TransactionId = TransactionId
                        AND FPT.TransactionStepId = TransactionStepId)
        AND EXISTS (SELECT 1
                    FROM [WarehouseMgmt].[DimLoyaltyProgramLevel] DLPL
                    WHERE DLPL.[Id] = DPL.VipLevelId)
        AND EXISTS (SELECT 1
                    FROM WarehouseMgmt.DimTimeZone DTZ
                    WHERE FPT.[TimeId] = DTZ.TimeUTCId
                        AND DTZ.TimeId BETWEEN @DimStartDate AND @DimEndDate)
    

    您可以共享一个执行计划吗?关于表上索引的详细信息?另外,在查询的末尾有一个小撇号。这有什么意义吗(可能是缺少一些代码?)或者这是一个错误?您可以尝试我的查询,看看执行时间是否有任何改进吗?我在问题中添加了执行计划。首先,您没有FPT_Ref表,其次,您无法筛选时间,然后在该表上进行联接。它返回错误。请查看我的代码并更改为same@user2171512这个想法是,这不是苏假定是相同的(某些查询是多余的)。我已对查询进行了更正,以便筛选器能够使用“时间内”。请尝试新查询。我的FPT_Ref。[PaymentReasonTextId]和FPT_Ref。[OriginalTransactionId]仍有错误。这是我的引用表(联接表)。我如何才能将其修复为与以前一样?@user2171512好的,我现在知道我错过了什么。您有关于优化的新解决方案吗?