【问题标题】:Materialize a CTE, or otherwise increase performance实现 CTE,或以其他方式提高性能
【发布时间】:2012-03-13 00:49:21
【问题描述】:

给定一个表(AccountId,ParentId NULL),我们希望能够快速找到: 1.主父ID(ParentId为null的accountId)。 2. 给定帐户 ID 的所有孩子。

使用 CTE,这相当容易。但是,我们不能将 CTE 保存在索引视图中,这会损害性能。我们已经提出了一些其他想法,比如将路径 (id1/id2/id3) 保存在另一个字段中,但这感觉有点 hacky。

我们想到了一个触发器,可以在每一行保存“主”ID,但我们不确定它在链的中间是如何工作的(1 拥有 2 拥有 3,但随后 2 转移到 7 )。它也不能解决“查找所有孩子”查询。

有什么想法吗?我们正在使用 SQL 2008 R2,但可以迁移到 SQL 2012。

【问题讨论】:

  • 我不认为 SQL Server 2012 有任何功能可以在这里提供帮助。但是,如果没有更多的上下文,很难理解为什么物化 CTE 或创建索引视图(什么?)将是解决性能问题的神奇答案。您能否介绍一下表结构、索引、数据量以及您正在运行的太慢的查询?
  • ParentId 有索引覆盖吗?

标签: sql-server performance parent-child common-table-expression recursive-query


【解决方案1】:

在SQL 2008中,有一个hierarchyid类型,基本上实现了将路径保存到根目录。 http://technet.microsoft.com/en-us/library/bb677290%28v=sql.100%29.aspx

如果您的层次结构大部分是静态的,则另一个选择是使用该表的非规范化版本,并将父级与每个子级相结合。因此,如果您的层次结构是 A 是 B 的父级,而 B 是 C 的父级,则非规范化表可能如下所示

parent child depth
A      A     0
A      B     1
A      C     2
B      B     0
B      C     1
C      C     0

现在,如果您同时索引父列和子列,搜索层次结构会变得非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多