存储过程优化有关问题

存储过程优化问题
SQL code

--存储过程
ALTER PROCEDURE [dbo].[p_BuyerVendorManager] 
(
    @PageIndex            INT,                --页数
    @PageSize            INT,                --每页数据条数
    @BigArea            INT,                --大区ID
    @Province            INT,                --省ID
    @City                INT,                --城市ID
    @VendorClass        INT,                --客户分类
    @SuperVenderTvaId    INT,                --客户所属
    @VendorFullName        NVARCHAR(100),        --客户名称
    @VendorTvaId        INT,                --客户tvaId
    @VendorStatus        INT,                --客户状态
    @AccountType        INT,                --客户类型
    @StartDateTime        DATETIME,            --拍品开始时间
    @EndDateTime        DATETIME,            --拍品结束时间
    @OrderByField        VARCHAR(100),        --排序字段  
    @RecordCount        INT OUTPUT            --输出总数据数                                                          
)
AS
BEGIN
    --===========================查询条件拼接====================================
    DECLARE @queryCondition VARCHAR(2000)
    SET @queryCondition=' WHERE vvm.Status<>-1';                                  
    IF @BigArea<>0
        SET @queryCondition=@queryCondition+' AND vvm.BigAreaId='+CAST(@BigArea AS VARCHAR);                      
    IF @Province<>0
        SET @queryCondition=@queryCondition+' AND vvm.ProvinceId='+CAST(@Province AS VARCHAR);
    IF @City<>0
        SET @queryCondition=@queryCondition+' AND vvm.CityID='+CAST(@City AS VARCHAR);
    IF @VendorClass<>0
        SET @queryCondition=@queryCondition+' AND vvm.VendorClass='+CAST(@VendorClass AS VARCHAR);
    IF @SuperVenderTvaId<>0
        SET @queryCondition=@queryCondition+' AND vvm.SuperVendorTvaID='+CAST(@SuperVenderTvaId AS VARCHAR);
    IF @VendorFullName<>''
        SET @queryCondition=@queryCondition+' AND vvm.VendorFullName like ''%'+@VendorFullName+'%''';
    IF @VendorTvaId<>0
        SET @queryCondition=@queryCondition+' AND vvm.TvaID='+CAST(@VendorTvaId AS VARCHAR);
    IF @VendorStatus<>-1
        SET @queryCondition=@queryCondition+' AND vvm.Status='+CAST(@VendorStatus AS VARCHAR);
    IF @AccountType<>0
        SET @queryCondition=@queryCondition+' AND (vvm.AccountType=3 OR vvm.AccountType='+CAST(@AccountType AS VARCHAR)+')';
    --=============================================================================
    DECLARE @SelectSql VARCHAR(100)
    DECLARE @FieldSql VARCHAR(MAX)
    DECLARE @BidPublishNumSql VARCHAR(1000)
    DECLARE @BuyerPublishNumSql VARCHAR(1000)
    DECLARE @AttentionPublishSql VARCHAR(1000)
    DECLARE @TradeSuccessPublishSql VARCHAR(1000)
    DECLARE @AppealedPublishSql VARCHAR(1000)
    DECLARE @FromSql VARCHAR(100)
    DECLARE @JoinSql VARCHAR(1000)
    DECLARE @ExecSql VARCHAR(MAX)
    
    SET @SelectSql='SELECT '
    SET @FieldSql='vvm.*,TradeOrder.TradeAmount,TradeOrder.Sevice_Pay,TradeOrder.Sevice_NotPay,TradeOrder.LogisticsFee,TradeOrder.TransferFee,'
    SET @BidPublishNumSql='dbo.GetBidPublish(vvm.TvaID,'''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''') AS BidPublishNum,'
    SET @BuyerPublishNumSql='dbo.BuyerPublish(vvm.TvaID,'''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''') AS BuyerPublishNum,'
    SET @AttentionPublishSql='dbo.AttentionPublish(vvm.TvaID,'''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''') AS AttentionPublishNum,'
    SET @TradeSuccessPublishSql='dbo.GetTradeSuccessPublish(vvm.TvaID,'''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''') AS TradeSuccessPublishNum,'
    SET @AppealedPublishSql='dbo.GetAppealPublish(vvm.TvaID,'''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''') AS AppealedPublishNum'
    SET @FromSql=' FROM V_VendorManager vvm'
    SET @JoinSql=' LEFT JOIN (SELECT * FROM dbo.GetVendorTradeData('''+CAST(@StartDateTime AS VARCHAR)+''','''+CAST(@EndDateTime AS VARCHAR)+''')) AS TradeOrder
                  ON vvm.TvaID=TradeOrder.BuyerTvaId'
    
    DECLARE @RecordCountSql NVARCHAR(4000)
    SET @RecordCountSql=@SelectSql+' @RecordCount=COUNT(1) '+@FromSql+@queryCondition
    EXEC SP_EXECUTESQL @RecordCountSql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUT
    
    SET @ExecSql=@SelectSql+
                 @FieldSql+
                 @BidPublishNumSql+
                 @BuyerPublishNumSql+
                 @AttentionPublishSql+
                 @TradeSuccessPublishSql+
                 @AppealedPublishSql+
                 @FromSql+
                 @JoinSql+
                 @queryCondition                 
    --实现数据的分页
    DECLARE @StartRow int,@EndRow INT
    IF @PageIndex<>-1
        BEGIN
            SET @StartRow=(@PageIndex-1)*@PageSize+1--起始页
            SET @EndRow=@StartRow+@PageSize-1--结束页                                                                  
            EXEC('
            SELECT * FROM (
                SELECT *, ROW_NUMBER() OVER (ORDER BY '+@OrderByField+') AS RowNumber
                FROM (
                        SELECT *,
                        dbo.GetTradeProportion(vmt.BuyerPublishNum, vmt.BidPublishNum) AS SuccessTradeProportion,
                        dbo.GetTradeProportion(vmt.AppealedPublishNum, vmt.BidPublishNum) AS AppealTradeProportion
                        from ('+
                        @ExecSql +') AS vmt
                ) AS vmtTable'+
            ') AS LastTable
            WHERE LastTable.RowNumber BETWEEN '+@StartRow+' AND '+@EndRow
            )
        END
    ELSE
        BEGIN
            EXEC('
                SELECT *, ROW_NUMBER() OVER (ORDER BY '+@OrderByField+') AS RowNumber
                FROM (
                        SELECT *,
                        dbo.GetTradeProportion(vmt.BuyerPublishNum, vmt.BidPublishNum) AS SuccessTradeProportion,
                        dbo.GetTradeProportion(vmt.AppealedPublishNum, vmt.BidPublishNum) AS AppealTradeProportion
                        from ('+
                        @ExecSql +') AS vmt
                ) AS vmtTable'
            )
        END
END

--自定义函数,取一个复杂的GetAppealPublish:
ALTER FUNCTION [dbo].[GetAppealPublish]
(
    @TvaId INT,
    @StartTime DATETIME,
    @EndTime DATETIME    
)
RETURNS INT
AS
BEGIN
    DECLARE @AppealPublishNum INT=0
    
    ;WITH TradeFailPublish AS (
        SELECT ato.TstOrderID
        FROM AuctionTstOrder ato
        WHERE ato.BuyerID=@TvaId AND (ato.TstResult=3 OR ato.TstResult=4) 
    ),
    
    AppealManager AS (
        SELECT ata2.ArbResult, ata2.OfflineResult, ata2.ArbTime, 
               ata.TstOrderId,atar.RespTvaId, atar.VendorType
        FROM AuctionTstAppeal ata
        LEFT JOIN AuctionTstArb ata2 ON ata.AppealId=ata2.AppealId
        LEFT JOIN AuctionTstArbResponsibility atar ON ata.AppealId=atar.AppealId
        WHERE ata.AppealStatus=2 AND (ata2.ArbResult=2 OR (ata2.ArbResult=3 AND ata2.OfflineResult=2))
              AND (ata.AppealType=1 OR ata.AppealType=3)
    )
    
    SELECT @AppealPublishNum=COUNT(1) FROM (
        SELECT am.RespTvaId,am.ArbTime FROM TradeFailPublish tfp 
        LEFT JOIN AppealManager AS am ON tfp.TstOrderID=am.TstOrderId
    ) AS PublishAppeal
    WHERE PublishAppeal.RespTvaId=@TvaId AND PublishAppeal.ArbTime BETWEEN @StartTime AND @EndTime
    
    RETURN @AppealPublishNum
END