首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将递归CTE过滤为视图

将递归CTE过滤为视图
EN

Database Administration用户
提问于 2022-07-15 11:52:57
回答 1查看 610关注 0票数 0

我正在使用MSSQL 2017,并使用CTE来获取与特定元素链接的历史树的根元素。

如果直接使用CTE,并且基本元素被过滤,则CTE非常快。主要问题是当用作视图时的性能,因为不可能直接在CTE的基本部分进行过滤。

示例:

创建包含1000个条目的tmp表:

代码语言:javascript
复制
SELECT TOP 1000 ID INTO #tElements from Elements

这是CTE等价于缓慢的视图:

代码语言:javascript
复制
WITH 
Tree AS
(SELECT        Element AS Node, Element, Parent
  FROM            Elements AS E
  UNION ALL
  SELECT        T.Node, E.Element, E.Parent, E.ProductID
  FROM         Elements AS E INNER JOIN
               Tree AS T ON T.Parent = E.Element)
SELECT DISTINCT Tree.Node, Tree.Element, Tree.Parent
FROM            Tree 
INNER JOIN      #tElements tmp on Tree.Node = tmp.ID
WHERE Tree.Parent IS NULL

这是直接过滤的CTE,速度快。

代码语言:javascript
复制
WITH 
Tree AS
(SELECT        Element AS Node, Element, Parent
  FROM            Elements AS E
  INNER JOIN      #tElements tmp on E.Element = tmp.ID
  UNION ALL
  SELECT        T.Node, E.Element, E.Parent, E.ProductID
  FROM         Elements AS E INNER JOIN
               Tree AS T ON T.Parent = E.Element)
SELECT DISTINCT Tree.Node, Tree.Element, Tree.Parent
FROM            Tree    
WHERE Parent IS NULL

也许有人有一个提示,告诉服务器首先过滤连接的基本元素,然后再执行递归部分?

谢谢迈克

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-07-15 14:14:21

可以将其创建为内联表值函数。

代码语言:javascript
复制
CREATE OR ALTER FUNCTION GetElementsTree (
  @ID int
)
RETURNS TABLE AS RETURN

WITH Tree AS (
    SELECT       Element AS Node, Element, Parent
    FROM         Elements AS E
    WHERE        E.Element = @ID

    UNION ALL

    SELECT       T.Node, E.Element, E.Parent, E.ProductID
    FROM         Elements AS E INNER JOIN
                 Tree AS T ON T.Parent = E.Element
)
SELECT
  Tree.Node,
  Tree.Element,
  Tree.Parent
FROM            Tree
WHERE Tree.Parent IS NULL;

go
代码语言:javascript
复制
SELECT DISTINCT
  Tree.Node,
  Tree.Element,
  Tree.Parent
FROM            #tElements tmp
CROSS APPLY     getElementsTree (tmp.ID) Tree
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/314457

复制
相关文章

相似问题

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