代码之家  ›  专栏  ›  技术社区  ›  Neil Knight

向CTE添加索引

  •  34
  • Neil Knight  · 技术社区  · 14 年前

    应该是个很直截了当的问题。我可以为公共表表达式(CTE)添加索引吗?

    3 回复  |  直到 14 年前
        1
  •  21
  •   marc_s Anurag    14 年前

    不。

    CTE是一个临时的“内联”视图-不能向此类构造添加索引。

    如果需要索引,请使用CTE的选择创建一个常规视图,并使其成为索引视图(通过向视图添加聚集索引)。你需要遵守这里列出的一套规则: Creating an Indexed View

        2
  •  65
  •   psymann    7 年前

    我也有同样的要求。无法将索引添加到CTE。但是,在CTE中选择添加 订货人

    (您还需要添加SELECT TOP 100%,以便在CTE SELECT中允许ORDER BY。)

    [编辑以添加以下注释中的转述引用]:
    如果你在CTE中有DISTINCT,那么TOP 100%不起作用。此作弊器方法始终可用:不需要在select中使用TOP,将ORDER BY语句更改为:

        3
  •  0
  •   Ludovic Aubert    4 年前

    不能为CTE编制索引,但方法是CTE可以使用基础索引。

    WITH cte AS (
        SELECT myname, SUM(Qty) FROM t GROUP BY myname
    )
    SELECT *
    FROM t a JOIN cte b ON a.myname=b.myname 
    

    在上面的查询中, a JOIN b t.myname 因为 GROUP BY .

    WITH cte AS (
        SELECT myname, SUM(Qty) OVER (PARTITION BY myname) AS SumQty, 
                    ROW_NUMBER() OVER (PARTITION BY myname ORDER BY myname, Qty) AS n
    )
    SELECT * FROM t a JOIN cte b ON a.myname=b.myname AND b.n=1 
    

    在后一个查询中, a连接b t、 我的名字 .

        4
  •  -3
  •   Peg    8 年前