【问题标题】:Is it possible -or recommended- to index an inline query to improve performance?是否可以(或推荐)索引内联查询以提高性能?
【发布时间】:2011-11-18 16:17:34
【问题描述】:

我不是 TSQL 专家,但我想知道这样的事情是否可能:

假设我有一个连接到另一个查询结果集的表的选择:

SELECT * 
FROM tProduct
JOIN (SELECT ProductId FROM ...... -- some other joins) tInlineQuey
ON tInlineQuery.ProductId = tProduct.Id 
WHERE tInlineQuery. -- some econdition

在 tInlineQuery 上创建索引是否可能或有意义,以便在该结果集上应用过滤可以更快地执行?
如果有,怎么可能?

【问题讨论】:

    标签: performance sql-server-2008 tsql indexing


    【解决方案1】:

    不,您可以在子查询中的对象上拥有合适的索引,但是您不能在子查询中添加临时索引,因为您在那里有它。您可以查询提示数据的连接方式,例如嵌套循环、合并或散列连接 - 但优化器往往会做出正确的决定。

    获得这种效果的一个选项是将该子查询的结果选择到一个临时表中,并在其中放置一个索引,然后加入该临时表。

    为此,您需要一个存储过程并包含以下代码:

    SELECT yourFields
    INTO #TempTableName
    JOIN SomeOtherTables
    WHERE SomeField=SomeValue;
    
    CREATE CLUSTERED INDEX SomeIndexName ON #TempTableName(SomeField,AnotherField);
    
    SELECT *
    FROM tProduct p
    JOIN #TempTableName t ON t.SomeField = p.SomeField
    ...
    
    DROP TABLE #TempTableName -- optional, the table will die when it goes out of scope at the end of the procedure.
    

    临时表索引不必是集群的,这取决于您的选择。

    【讨论】:

    • 如果不是太复杂,你能写我如何在我的场景中的临时表上创建索引吗?谢谢
    【解决方案2】:

    Andrew 有一个很好的答案,但如果这是您经常使用的子查询,另一种选择是创建索引视图。有几篇关于这方面的好文章,包括我在 Sql Server Central 上写的一篇题为 On Indexes and Views 的文章。

    【讨论】:

    • +1 :我肯定同意这一点,如果它会被大量使用,索引视图可能是一个更好的选择。 (如果没有使用模式、插入率等,很难分辨)
    猜你喜欢
    • 2019-12-29
    • 2012-05-12
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多