[英]What is the more efficient T-SQL way to query a table with Hierarchical data type
我有一個名為Budgetline
的表。 它跟蹤項目的預算項目(撥款)。
架構 :
BudgetId int
Amount decimal
LoginUser varchar
InsertDate datetime
GrantPhaseID int
BudgetChartID int
Rootdir hierarchyid
OverHead decimal
Amount
列是預算行的預算金額。 預算行可以有一個子預算行。 一個子預算項目可以有另一個子預算項目。 有時最多可以有5個級別。
還有另一個表TransactionsDetail
; 它跟蹤預算線支出
架構 :
TransactionDetailID int
TransactionID int
Amount numeric
ExRateAmount numeric
TransactionDate date
BudgetId int
InsertDate datetime
OverHead decimal
Paid bit
PaidDate datetime
LoginUser varchar
項目(贈款)有階段。 還有另一個表GrantPhase
可以跟蹤此情況。
還有另一個表稱為BudgetChart
。 它包含預算線列表。 不同的項目(贈款)可以有相同的預算額度。
以下是獲取預算行(父級)的子預算行(后代)的完整表值函數。
ALTER FUNCTION [dbo].[getSUBS]
(@BudgetID INT
--,@GrantPhaseID INT
)
RETURNS @Mytable TABLE (CID INT,
[COUNT] INT,
DESCRIPTION VARCHAR(256),
AMOUNT NUMERIC(18,2),
SPENT NUMERIC(18,2),
BALANCE NUMERIC(18,2),
OVERHEAD NUMERIC(18,2)
-- BUDGETLIMIT numeric(18,2)
)
AS
BEGIN
-- get budgetline root level
declare @BudgetIDrootRevel int
SELECT @BudgetIDrootRevel = RootDir.GetLevel() FROM budgetlines WHERE budgetid = @BudgetID
-- GET GRANTPHASEID
DECLARE @GrantPhaseID int=(
select GrantPhaseID from BudgetLines where BudgetId=@BudgetID
)
DECLARE @RootDir HIERARCHYID
SELECT @RootDir = RootDir FROM budgetlines WHERE budgetid = @BudgetID
insert into @Mytable(
CID
, [COUNT]
, DESCRIPTION
, AMOUNT
, SPENT
, BALANCE
, OVERHEAD
--, BUDGETLIMIT
)
SELECT
BudgetId
, ROW_NUMBER() OVER (ORDER BY BudgetID DESC)
, [Description]
, dbo.[getBudgetAmount](BudgetLines.BudgetId) AMOUNT --Sums all transactions made in the TransactionDetails table
, [dbo].[getBudgetSpent](BudgetId) as SPENT
, ISNULL((dbo.[getBudgetAmount](BudgetLines.BudgetId)-[dbo].[getBudgetSpent](BudgetId)),0) as BALANCE
, BudgetLines.OVERHEAD
--, BUDGETLIMIT
FROM BudgetLines INNER JOIN BudgetChart
ON BudgetChart.BudgetChartID = BudgetLines.BudgetChartID
WHERE RootDir.IsDescendantOf(@RootDir)=1
and GrantPhaseID = @GrantPhaseID
and Rootdir.GetLevel()=(@BudgetIDrootRevel+1)
--AND isBudgetline=1
return ;
end
有用。
我的挑戰:
如果特定預算線具有3個或更多子級別(后代),則需要花費10秒鍾才能返回子預算線。
我的問題:
有沒有更好的方法來優化(重寫)此功能,使其運行更快。
下面是設計的外觀。 用戶可以通過雙擊一行或單擊[下移]按鈕來查看子預算行。
不用說:這是我關於全能stackoverflow的第一篇文章。 抱歉,如果我違反任何社區規則。 我還在學習。
可能值得指出的是,您正在/可能假設一旦要求主預算行,最好在數據庫中完成此“獲取子預算行”
考慮到您正在構建的UI可以理解/顯示主從關系,並且如果不總是需要子級別,則可以在UI中以更高的效率完成很多操作*。如果用戶確實只想在UI中查看根級別,則返回5個級別的層次結構數據。 因此,最好讓UI驅動數據需求-只需根據用戶的要求返回相關級別即可
*高效的方面:不浪費DB的時間來收集不需要的數據/如果不使用它,則不會通過網絡傳輸數據
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.