簡體   English   中英

用分層數據類型查詢表的更有效的T-SQL方法是什么

[英]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

有用。

  • 預算行表只有252條記錄
  • TransactionDetails表只有172條記錄

我的挑戰:

如果特定預算線具有3個或更多子級別(后代),則需要花費10秒鍾才能返回子預算線。

我的問題:

有沒有更好的方法來優化(重寫)此功能,使其運行更快。

下面是設計的外觀。 用戶可以通過雙擊一行或單擊[下移]按鈕來查看子預算行。

用戶界面外觀

不用說:這是我關於全能stackoverflow的第一篇文章。 抱歉,如果我違反任何社區規則。 我還在學習。

可能值得指出的是,您正在/可能假設一旦要求主預算行,最好在數據庫中完成此“獲取子預算行”

考慮到您正在構建的UI可以理解/顯示主從關系,並且如果不總是需要子級別,則可以在UI中以更高的效率完成很多操作*。如果用戶確實只想在UI中查看根級別,則返回5個級別的層次結構數據。 因此,最好讓UI驅動數據需求-只需根據用戶的要求返回相關級別即可

*高效的方面:不浪費DB的時間來收集不需要的數據/如果不使用它,則不會通過網絡傳輸數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM