使用 INCLUDE 索引 OUTER/CROSS APPLY 的 WHERE 子句

Posted

技术标签:

【中文标题】使用 INCLUDE 索引 OUTER/CROSS APPLY 的 WHERE 子句【英文标题】:Indexing WHERE clause of OUTER/CROSS APPLY with INCLUDE 【发布时间】:2015-08-17 14:14:31 【问题描述】:

我已经读过,在使用 WHERE 子句来限制返回的记录时应该使用索引列(即SELECT * from Table1 WHERE Field1 = 'abc')。

在使用APPLY 时是否适用此规则,如

SELECT t.Field1,x.Field2 from Table1 t OUTER APPLY (select * from Table2 x WHERE t.Field1 = x.Field1?

换句话说,在 Table2.Field1 上放置索引会加快上述查询的速度吗?

对不起,如果答案很明显,我对 OUTER 和 CROSS APPLY 的机制没有深入了解,只是它们可以用来代替 JOIN。

编辑 基于这个线程 (Hard and Fast Rules for include columns in Index) 的一个更好的问题是,我是否应该对我从另一个表中提取的所有列使用 INCLUDE,如果是这样,使用 OUTER APPLY (select Field1,Field2 而不是更有效OUTER APPLY (select *

【问题讨论】:

这是关于哪个 dbms 产品? 我使用 SQL Server 2008,但我认为这可能是一个跨越多个 DBMS 的问题 Apply 只是内部连接。完全相同的策略适用。 【参考方案1】:

好吧,每当您为列指定条件时,索引将有助于加快搜索速度。

但这是有代价的:在插入期间,必须重新计算索引,当然您还需要磁盘空间。但除此之外,索引具有(几乎)唯一的优势。

【讨论】:

【参考方案2】:

在 OUTER Apply 上使用的列应该被索引,并且应该用于连接主查询,这将改善查询检索过程,因为它将用作聚集索引查找,它将使查询更快,执行计划将在成功检索时重复使用。

【讨论】:

以上是关于使用 INCLUDE 索引 OUTER/CROSS APPLY 的 WHERE 子句的主要内容,如果未能解决你的问题,请参考以下文章

[转帖]SQL Server 索引中include的魅力(具有包含性列的索引)

建立词索引表

oracle有没有类似sqlserver中include语句的覆盖索引?

在索引中将列添加到 INCLUDE 的影响

SQL Server 索引中include的魅力(具有包含性列的索引)

C ++:无法将索引分配给迭代器