CTE
版本沒有優化獲取分層數據的方式。 (Refer MSDN Blog)
你應該做下面提到的事情。它測試了1000萬條記錄,速度比CTE版本快300倍:)
Declare @table table(Id int, ParentId int, Name varchar(10))
insert into @table values(1,NULL,'A')
insert into @table values(2,1,'B')
insert into @table values(3,2,'C')
insert into @table values(4,1,'E')
insert into @table values(5,3,'E')
DECLARE @Counter tinyint = 0;
IF OBJECT_ID('TEMPDB..#ITEM') IS NOT NULL
DROP TABLE #ITEM
CREATE TABLE #ITEM
(
ID int not null
,ParentID int
,Name VARCHAR(MAX)
,lvl int not null
,RootID int not null
)
INSERT INTO #ITEM
(ID,lvl,ParentID,Name,RootID)
SELECT Id
,0 AS LVL
,ParentId
,Name
,Id AS RootID
FROM
@table
WHERE
ISNULL(ParentId,-1) = -1
WHILE @@ROWCOUNT > 0
BEGIN
SET @Counter += 1
insert into #ITEM(ID,ParentId,Name,lvl,RootID)
SELECT ci.ID
,ci.ParentId
,ci.Name
,@Counter as cntr
,ch.RootID
FROM
@table AS ci
INNER JOIN
#ITEM AS pr
ON
CI.ParentId=PR.ID
LEFT OUTER JOIN
#ITEM AS ch
ON ch.ID=pr.ID
WHERE
ISNULL(ci.ParentId, -1) > 0
AND PR.lvl = @Counter - 1
END
select * from #ITEM
您應儘量避免使用標量函數。他們效率非常低下。更糟糕的是,當你開始在它們內部投擲循環時。這聽起來像一個非常典型的遞歸類型。不知道爲什麼你會通過這個分隔的名稱列表。 –
@SeanLange - 謝謝,我意識到標量函數的低效率 - 這只是我的要求。 – Denis
奇怪的要求,但無論如何。如果你真的想要一些幫助,你可以發佈一些細節?這是一個遞歸查詢還是隻是試圖解析一個分隔列表併爲每個值做一個查詢? –