0

我在搞乱嵌套集层次模型,并有一个名为 CategoryNest 的类别表,其中包含字段 CategoryID int identity、CategoryName nvarchar(100)、L int、R int、CreatedOn datetime、UpdatedOn datetime。

    Note: "Store" is a schema in MS SQL Server.

    SELECT CategoryID,
           node AS CategoryName,
           (
            SELECT
                   '/' + CAST(parent.CategoryID AS nvarchar(max))
            FROM 
                   Store.CategoryNest node,
                   Store.CategoryNest parent
            WHERE
                   node.L BETWEEN parent.L AND parent.R
                   AND node.CategoryID = Category.CategoryID
            FOR XML PATH('')
           ) AS BreadcrumbIDs
    FROM
    /* EDIT: this was an unnecessary join.
             Removing it, helped me get results must faster. 
          (
             SELECT
                    node.CategoryID,
                    node.CategoryName node,
                    parent.CategoryName parent
              FROM
                    Store.CategoryNest node,
                    Store.CategoryNest parent
              WHERE 
                    node.L BETWEEN parent.L AND parent.R
          ) AS Category
    */
          Store.CategoryNest Category
    GROUP BY 
          node,
          CategoryID

查询工作正常,它会生成所需的输出,但在使用 458,000 条记录进行测试时,需要一个多小时(注意:查询执行已取消)。

编辑:应用我编辑的查询后,结果必须更快,但我仍然愿意接受进一步加快速度的建议。

    Sample results:
    CategoryID CategoryName Breadcrumbs
    1          ROOT         /1
    2          A            /1/2
    3          AA           /1/2/3
    4          AAA          /1/2/3/4
    5          B            /1/5
    6          C            /1/6
    7          CC           /1/6/7

我想知道是否有办法优化此查询以在几秒钟而不是几小时内获得结果。

编辑:没有更多的时间,解决了这个问题,但仍然对加快速度的建议持开放态度。

谢谢你。

4

1 回答 1

1

使用子查询可以强制优化器使用循环连接。这对于性能来说是非常不幸的。

将子查询 ( ... '/' + ...) 重新表述为JOIN.

这部分是优化器,部分是不可优化的语义差异。

于 2013-01-17T19:03:49.523 回答