Sql server 当列仅用于(散列)联接时,索引是否有任何好处?

Sql server 当列仅用于(散列)联接时,索引是否有任何好处?,sql-server,oracle,join,indexing,Sql Server,Oracle,Join,Indexing,假设列仅用于连接。(即,我不会在列上排序,也不会单独搜索列中的特定值)。。。我将使用该列的唯一目的是连接到另一个表 如果数据库支持散列联接(据我所知,这不会从索引中受益)。。那么,添加索引不是完全多余吗?(和浪费)?在SQL Server中,它仍然会阻止键查找 如果在未索引的字段上加入,服务器需要从聚集索引中获取该字段的值 如果在NC索引上加入JOIN,则可以直接获得值,而无需从集群(实际上是整个表)加载所有数据页 因此,基本上,当第一步基于非常窄的索引而不是从磁盘加载的整个表进行筛选时,您可以

假设列仅用于连接。(即,我不会在列上排序,也不会单独搜索列中的特定值)。。。我将使用该列的唯一目的是连接到另一个表


如果数据库支持散列联接(据我所知,这不会从索引中受益)。。那么,添加索引不是完全多余吗?(和浪费)?

在SQL Server中,它仍然会阻止
键查找

如果在未索引的字段上加入
,服务器需要从聚集索引中获取该字段的值

如果在NC索引上加入
JOIN
,则可以直接获得值,而无需从集群(实际上是整个表)加载所有数据页


因此,基本上,当第一步基于非常窄的索引而不是从磁盘加载的整个表进行筛选时,您可以为自己节省大量IO。

您如何知道数据库将(始终)使用哈希连接来连接到此表???给定适当的统计信息。。。我认为基于成本的优化器足够聪明,可以在成本更高的嵌套循环(没有索引)上选择散列联接。无法保证Oracle将如何执行SQL,解释计划可以更改,数据可以更改,统计数据可以更改,…通过不添加索引,还可以大大降低使用合并联接的可能性,因为这需要先添加排序步骤。这也是FK关系中的连接列,因为验证FK可以利用索引。当然,无法保证Oracle将如何执行SQL。。我假设对于小表,Oracle甚至不需要对联接进行哈希运算,只需要使用一个嵌套循环。。。但是,如果有适当的统计数据,我认为有理由假设Oracle在处理大量数据时,在嵌套循环上使用更便宜的哈希连接,而不使用索引。。。无论哪种方式,哈希连接都必须在每个表中迭代一次。。。i、 e.一次到一次表,为每个join子句生成哈希值。。然后通过另一个表将行与生成的哈希表匹配一次。我几乎认为拥有一个非聚集索引(即普通的旧堆表)。。甚至会快一点(数据在堆表中占用的空间比聚集索引少)。不,它将遍历索引而不是表。这意味着更少的数据=更少的页面=更少的IO=更快。也许我遗漏了什么。。但是如果我遍历所有内容(100%的行)。。拥有索引的速度增加了多少?@vicjugador你错过了什么。并非所有索引都相等。把它想象成一本书。如果您有一本书有一个项目及其所有值的列表(聚集索引),而另一本书只有一个方面的所有不同值的列表(NC索引),那么您可以在每页的第二本书中容纳更多的条目,并阅读更少的页面以获得相同的信息。SQL从狭窄的NC索引中提取的数据要少得多,并且可以更快地处理它。啊,明白了。。有道理。谢谢