0

ネストされたセット階層モデルをいじっていて、CategoryID int Identity、CategoryName nvarchar(100)、L int、R int、CreatedOn datetime、UpdatedOndatetimeのフィールドを持つCategoryNestというカテゴリテーブルがあります。

    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レコードでテストすると、1時間以上かかります(注:クエリの実行はキャンセルされました)。

編集:編集したクエリを適用した後、結果はより速くなければなりませんが、私はまだ物事をさらにスピードアップするための提案を受け入れています。

    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 に答える