首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Server中如何减少查询执行时间?

在Server中如何减少查询执行时间?
EN

Stack Overflow用户
提问于 2022-04-20 19:44:59
回答 1查看 207关注 0票数 0

我在查询中使用的表包含很多记录。从数据库中提取记录需要超过1分钟。我正在使用组和外部应用两者。有人能帮我如何优化查询,以便减少执行时间吗?

存储过程查询:

代码语言:javascript
代码运行次数:0
运行
复制
DECLARE @BankAccount NVARCHAR(200) = NULL,  
        @Bank NVARCHAR(100) = NULL,  
        @AccountType NVARCHAR(200) = NULL,  
        @Status NVARCHAR(100) = NULL,  
        @Agent NVARCHAR(100) = NULL,  
        @Month NVARCHAR(100) = NULL,  
        @FromDate DATETIME ='2000-01-01',  
        @ToDate DATETIME = '2022-01-01',
    
        @pagenumber INT = 1,  
        @pagesize INT = 20
    
BEGIN
    DECLARE @IsMonthNull INT = 0, 
            @recordExistInPrevMonth INT = 0, 
            @isPreviousMonth DATETIME = NULL;
    
    SELECT 
        rslt.TotalRows,
        rslt.BRSAccountID,
        rslt._AccountNumber,
        rslt.OpeningBalance, 
        rslt.Credits, 
        rslt.Debits, 
        rslt.ClosingBalance, 
        rslt.DateRangeFrom, 
        rslt.DateRangeTo,
        rslt._Bank,
        rslt._Agent 
    FROM
        (SELECT 
             COUNT(bt.AccountNumber) OVER() TotalRows, 
             ROW_NUMBER() OVER (ORDER  BY bt.AccountNumber ASC) AS RowNumber,
             bt.BRSAccountID,
             bt.AccountNumber AS _AccountNumber,
             CAST((CASE
                       WHEN @IsMonthNull = 1 
                           THEN ISNULL(BankTransactionOpngBalance.OpeningBalance, 0) 
                           ELSE ISNULL(Opng.OpeningBalance, 0)
                   END) AS VARCHAR(MAX)) OpeningBalance,  
             CAST(cdt.Credits AS varchar(max)) AS Credits,
             CAST(dbt.Debits AS varchar(max)) AS Debits,  
             CAST((CASE 
                       WHEN ISNULL(Clsg.ClosingBalance, 0) = 0 
                           THEN ClsgNew.ClosingBalance  
                       WHEN @IsMonthNull = 1 
                           THEN ISNULL(ClsgNew.ClosingBalance, 0) 
                       ELSE Clsg.ClosingBalance 
                   END) AS VARCHAR(MAX)) ClosingBalance,   
             CAST(@FromDate AS VARCHAR(MAX)) DateRangeFrom,
             CAST(@ToDate AS VARCHAR(MAX)) DateRangeTo,
             bt.Bank As _Bank,
             CAST(ISNULL((SELECT TOP 1 ag.AssignedAgent AS AssignedAgent  
                          FROM RecConfig ag 
                          WHERE ag.BRSAccountID = bt.BRSAccountID), 0) AS varchar(max)) AS _Agent
         FROM 
             BankTransaction as bt
         INNER JOIN 
             BankAccountsReconciliation rec ON bt.BRSAccountID = rec.BRSAccountID  
                                            AND bt.AccountNumber = bt.AccountNumber
         OUTER APPLY 
             (SELECT TOP 1 BankBalance AS OpeningBalance   
              FROM BankPeriodEndBalance bal  
              WHERE bal.BRSAccountId = bt.BRSAccountID 
                AND CAST(bal.PeriodEndDate AS DATE) >= CAST(@FromDate AS DATE) 
                AND CAST(bal.PeriodEndDate AS DATE) <= CAST(@ToDate AS DATE)  
              ORDER BY bal.PeriodEndDate DESC) Opng  
         OUTER APPLY
             (SELECT TOP 1 bnkTrans.Closing_Balance AS OpeningBalance   
              FROM BankTransaction bnkTrans  
              WHERE bnkTrans.BRSAccountId = bt.BRSAccountID 
                AND CAST(bnkTrans.Date AS DATE) < CAST(@FromDate AS DATE)   
              ORDER BY bnkTrans.Date  DESC) BankTransactionOpngBalance 
         OUTER APPLY  
             (SELECT SUM(bnkt.Amount) AS Credits 
              FROM BankTransaction bnkt  
              WHERE bnkt.Debit_Credit = 'CR' 
                AND bnkt.BRSAccountID = bt.BRSAccountID  
                AND CAST(bnkt.Date AS DATE) >= CAST(@FromDate AS DATE) 
                AND CAST(bnkt.Date AS DATE) <= CAST(@ToDate AS DATE)) cdt
         OUTER APPLY 
             (SELECT SUM(bnkt.Amount) AS Debits 
              FROM BankTransaction bnkt  
              WHERE bnkt.Debit_Credit = 'DR' 
                AND bnkt.BRSAccountID = bt.BRSAccountID  
                AND CAST(bnkt.Date AS DATE) >= CAST(@FromDate AS DATE) 
                AND CAST(bnkt.Date AS DATE) <= CAST(@ToDate AS DATE)) dbt
         OUTER APPLY 
             (SELECT TOP 1 BankBalance AS ClosingBalance 
              FROM BankPeriodEndBalance bal  
              WHERE bal.BRSAccountId = bt.BRSAccountID 
                AND CAST(bal.PeriodEndDate AS DATE) <= CAST(@ToDate AS DATE) 
                AND CAST(bal.PeriodEndDate AS DATE) >= CAST(@FromDate AS DATE)  
              ORDER BY bal.PeriodEndDate DESC) Clsg  
         OUTER APPLY 
             (SELECT TOP 1 bal.Closing_Balance AS ClosingBalance 
              FROM BankTransaction bal  
              WHERE bal.BRSAccountId = bt.BRSAccountID 
                AND CAST(bal.Date AS DATE) <= CAST(@ToDate AS DATE) 
                AND CAST(bal.Date AS DATE) >= CAST(@FromDate AS DATE)  
              ORDER BY bal.date DESC) ClsgNew 
         WHERE  
             bt.AccountNumber  = ISNULL(@BankAccount, bt.AccountNumber) 
             AND CAST(bt.Date AS DATE) <= CAST(@ToDate AS DATE) 
             AND CAST(bt.Date AS DATE) >= CAST(@FromDate AS DATE) 
             AND (LEFT(bt.BSB, 2) = ISNULL(@Bank, LEFT(bt.BSB, 2))) 
             AND rec.Status = ISNULL(@Status, rec.Status)
             AND rec.AccountTypeId = ISNULL(@AccountType, rec.AccountTypeId)
         GROUP BY
             bt.AccountNumber, bt.BRSAccountID, 
             BankTransactionOpngBalance.OpeningBalance, 
             Opng.OpeningBalance, cdt.Credits, dbt.Debits,
             clsg.ClosingBalance, ClsgNew.ClosingBalance, bt.Bank) rslt
    WHERE 
        ((@Agent Is NOT NULL AND _Agent = @Agent) OR @Agent IS NULL) 
        AND RowNumber BETWEEN ((@pagenumber-1) * @PageSize) + 1 AND((@pagenumber-1) * @PageSize) + 1 + @PageSize -1 
     OPTION (RECOMPILE)
END

上面的查询工作正常,但有时需要超过2分钟。

EN

回答 1

Stack Overflow用户

发布于 2022-04-20 19:49:45

使用索引显着减少了执行时间。索引实现了b树算法,减少执行时间的缺点是需要额外的空间和几秒钟来构建索引。插入、删除也可能需要更长时间,但查询要快得多。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71945387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档