SQL Server中的哈希集合相当于什么?

7
我想创建一个大表(约450亿行),该表始终由唯一键访问。
在数据库之外,最好用于保存此数据的结构是字典或哈希集,但由于数据的大小,因此无法在数据库之外执行此操作。
SQL Server是否提供了针对键值访问进行优化的结构?我知道聚集键非常快,但它仍然是索引,因此遍历索引页面会有一些额外的磁盘读取。我想从SQL Server中获得的是一种“本地”结构,它将数据存储为键值对,然后使根据键访问值成为可能。
换句话说,我的问题是如何在没有索引的情况下在SQL Server中存储450亿行数据并有效地访问它们,因为读取索引非叶子页可能导致大量IO,并且由于每个值都可以通过唯一键访问,所以应该可以拥有一种哈希键解析为值物理位置的结构。要获取1个值,我们需要执行1次读取(除非存在哈希冲突)。
(Oracle中的等效项是哈希集群)
感谢您的帮助。
2个回答

3

在 SQL Server 中不存在这样的东西。你唯一的选择是索引。如果你要为给定的键请求所有列, 你应该使用聚集索引。如果你只需要请求子集, 你应该使用一个非聚集索引, 只包括你想要的列, 如下所示:

  create index IX_MyBigTable on MyBigTable(keyColumn) include (col1, col2, col3youneed);

这将非常高效。


遍历B树可能并不比生成哈希值低效多少,而SQL Server中聚集索引如此重要的原因是数据行存储在叶级别。因此,读取命中索引键的B树叶子节点也会读取该键的数据行。 - Rick
这个答案是正确的。中间索引级别将会很小并且完全缓存。基本上,任何对这样一张表的 PK 获取都最多只需要一个 IO。与使用磁盘哈希表相比,您甚至可以从键局部性中受益。 - usr
1
随机建议 - 如果你真的、真正、百分之百只做键值查找,而且绝对不进行任何类型的关系查询,也许 SQL 不是你的答案?看看 Redis 吧 - 它的速度快得难以置信,支持事务,一致性强,可以持久化到磁盘,设置起来也很简单 - 听起来可能更适合你。http://redis.io - John Gibb
感谢您的反馈。我将首先进行更多关于集群主键的测试。 - user1044169

0
根据我的基准测试,最好的方法是为键创建一个哈希列。详情

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接