是否可以 - 或建议 - 索引内联查询以提高性能?

时间:2011-11-18 16:17:34

标签: performance sql-server-2008 tsql indexing

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

想象一下,我有一个select连接到另一个查询结果集的表:

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

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

2 个答案:

答案 0 :(得分:3)

不,您可以在子查询中的对象上使用合适的索引,但是您不能在子查询中添加临时索引。您可以查询提示数据连接的方式,例如嵌套循环,合并或散列连接 - 但优化器倾向于做出正确的决定。

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

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

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.

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

答案 1 :(得分:3)

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