SQL Server2014 哈希索引原理详解_MsSql

当一个key-value键值对传递给一个哈希函数的时候,经过哈希函数的计算之后,根据结果会把key-value键值对放在合适的hash buckets(哈希存储桶)里

举个栗子

我们假设对10取模( % 10 )就是哈希函数。如果key-value键值对的key是1525 ,传递到哈希函数,那么1525 会存放在第五个bucket里

因为5 as 1525 % 10 = 5。

同样,537 会存放在第七个bucket ,2982 会存放在第二个bucket ,依次类推

同样,在hash index里面,哈希索引列会被传递给哈希函数做匹配(类似于java里面的HashMap的Map操作),匹配成功之后,

索引列会被存储在匹配到的hash bucket里面的表里,这个表里会有实际的数据行指针,再根据实际的数据行指针查找对应的数据行。

概括来说,要查找一行数据或者处理一个where子句,SQL Server引擎需要做下面几件事

1、根据where条件里面的参数生成合适的哈希函数

2、索引列进行匹配,匹配到对应hash bucket,找到对应hash bucket意味着也找到了对应的数据行指针(row pointer)

3、读取数据

哈希索引比起B树索引简单,因为它不需要遍历B树,所以访问速度会更快

 

哈希函数和相应语法的例子

CREATE TABLE dbo.HK_tbl
 (
  [ID] INT IDENTITY(1, 1)
    NOT NULL
    PRIMARY KEY NONCLUSTERED HASH WITH ( BUCKET_COUNT = 100000 ) ,
  [Data] char(32) COLLATE Latin1_General_100_BIN2
      NULL ,
  [dt] datetime NOT NULL,
 )
 WITH (
   MEMORY_OPTIMIZED =
   ON,
   DURABILITY =
   SCHEMA_AND_DATA);

在SQL Server 2014里面,内存优化表创建完之后就不能再加哈希索引了,但是在 SQL Server 2016 里支持表创建完之后添加哈希索引,不过

添加哈希索引是一个离线操作。

哈希索引的Bucket 数量

( BUCKET_COUNT = 100000 )定义了哈希索引能够使用的BUCKET数量,这个Bucket 是固定的并且由用户指定Bucket 数量,

而不是执行查询的时候由SQL Server决定生成的Bucket 数量。BUCKET数量总是2的次方的四舍五入( 1024, 2048, 4096 etc..)

SQL Server2014的哈希索引其实跟MySQL的自适应哈希索引原理其实差不多,都是为了摆脱B树的束缚,使查找效率更快

How does a relational database work这篇文章也有描述hash join的原理,大家可以看一下

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索哈希索引原理
sqlserver 哈希索引、哈希索引、mysql哈希索引、mysql 自适应哈希索引、自适应哈希索引,以便于您获取更多的相关知识。

时间: 2024-10-05 12:37:41

SQL Server2014 哈希索引原理详解_MsSql的相关文章

SQL Server2014 哈希索引原理详解

当一个key-value键值对传递给一个哈希函数的时候,经过哈希函数的计算之后,根据结果会把key-value键值对放在合适的hash buckets(哈希存储桶)里 举个栗子 我们假设对10取模( % 10 )就是哈希函数.如果key-value键值对的key是1525 ,传递到哈希函数,那么1525 会存放在第五个bucket里 因为5 as 1525 % 10 = 5. 同样,537 会存放在第七个bucket ,2982 会存放在第二个bucket ,依次类推 同样,在hash inde

SQL Server时间戳功能与用法详解_MsSql

本文实例讲述了SQL Server时间戳功能与用法.分享给大家供大家参考,具体如下: 一直对时间戳这个概念比较模糊,相信有很多朋友也都会误认为:时间戳是一个时间字段,每次增加数据时,填入当前的时间值.其实这误导了很多朋友. 1.基本概念 时间戳:数据库中自动生成的唯一二进制数字,与时间和日期无关的, 通常用作给表行加版本戳的机制.存储大小为 8个字节. 每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加.该计数器是数据库时间戳.这 可以

基于SQL Server OS的任务调度机制详解_MsSql

简介      SQL Server OS是在Windows之上,用于服务SQL Server的一个用户级别的操作系统层次.它将操作系统部分的功能从整个SQL Server引擎中抽象出来,单独形成一层,以便为存储引擎提供服务.SQL Server OS主要提供了任务调度.内存分配.死锁检测.资源检测.锁管理.Buffer Pool管理等多种功能.本篇文章主要是谈一谈SQL OS中所提供的任务调度机制. 抢占式(Preemptive)调度与非抢占式(non-Preemptive)调度     数据

MySQL数据库InnoDB索引原理详解实践教程【图】

InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比. 这篇文章是我在学习过程中总结完成的,内容主要来自书本和博客(参考文献会给出),过程中加入了一些自己的理解,描述不准确的地方烦请指出. 1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分. 先看看几种树形结构: 1 搜索二叉树

SQL Server数据库快照工作原理详解

数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由快照被执行的时间点来决定它的内容.本文通过实例讲述如何操作数据库快照. 在SQL Server 2005中,它的另外一个强大的新特点是数据库快照.数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由快照被执行的时间点来决定它的内容. 这些数据库快照在报表方面是非常有价值,因为在快照数据库中或者在原数据库中,对于任何查询而言没有锁就将被执行.快照也可以使用在灾难恢复中,因为你可以将现有的数据恢复到现有的快照中,或者还可以在有害

SQL SERVER 2000安装教程图文详解_MsSql

注意:Windows XP不能装企业版.win2000\win2003服务器安装企业版一.硬件和操作系统要求 下表说明安装 Microsoft SQL Server 2000 或 SQL Server 客户端管理工具和库的硬件要求. 硬件 最低要求计算机 Pentium 166 MHz 或更高. 内存 (RAM)至少 64 MB,建议 128 MB 或更多.根据笔者的经验,内存容量可以和数据容量保持1:1的比例,这样可以更好的发挥其效能.硬盘空间需要约500MB的程序空间,以及预留500M的数据

深入SQL Server 跨数据库查询的详解_MsSql

语句SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field"DBO"可以省略 如SELECT * FROM 数据库A..表A a, 数据库B..表B b WHERE a.field=b.field SqlServer数据库:--这句是映射一个远程数据库EXEC sp_addlinkedserver '远程数据库的IP或主机名',N'SQL Server'--这句是登录远程数据库EXEC sp_addlinkeds

SQL Server UPDATE语句的用法详解_MsSql

SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对SQL Server UPDATE语句有更多的了解. 现实应用中数据库中的数据改动是免不了的.通常,几乎所有的用户数据库中的大部分数据都要进行某种程度的修改.在SQL Server数据库中要想修改数据库记录,就需要用UPDATE语句,UPDATE语句就是为了改变数据库中的现存数据而存在的.这条语句虽然有一些复杂的选项,但确实是最容易学习的语句之一.这是因为在大

SQL Server正则表达式 替换函数应用详解_MsSql

--SQL正则替换函数 复制代码 代码如下: CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace varchar(1000), --替换值 @globalReplace bit = 1, --是否是全局替换 @ignoreCase bit = 0 --是否忽略大小写 ) returnS varchar(1000) AS begin declare @hr