我在查询中使用的表包含很多记录。从数据库中提取记录需要超过1分钟。我正在使用组和外部应用两者。有人能帮我如何优化查询,以便减少执行时间吗?
存储过程查询:
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分钟。
发布于 2022-04-20 11:49:45
使用索引显着减少了执行时间。索引实现了b树算法,减少执行时间的缺点是需要额外的空间和几秒钟来构建索引。插入、删除也可能需要更长时间,但查询要快得多。
https://stackoverflow.com/questions/71945387
复制相似问题