SQL Server - 哈希索引
转载自:https://blog.csdn.net/josjiang1/article/details/80637076
作者:josjiang1
————————总结————————
使用场景:
1,当表中一个字段过长时,建立索引就不适合的了,建立索引的一个原则就是索引不能太宽。
2,对于varchar(max)、nvarchar(max) 和 varbinary(max) 大值数据类型根本就不能建立索引。
--(@URL nvarchar(500) 无法创建索引)--
SELECT * FROM tablename WHERE URL = @URL
定义:
返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。使用 CHECKSUM 生成哈希索引,通过将校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。
步骤:
1- 为表的URL列添加校验和,并将其作为一列 (csURL) 加入该表:
alter table tablename add csURL as CHECKSUM(URL)
2- 为校验和列添加索引:
CREATE INDEX URL_index ON tablename (csURL);
3- 使用索引进行查询:
SELECT * FROM tablename WHERE csURL =CHECKSUM(@URL)
不支持类型:
CHECKSUM函数无法应用于如下非可比数据类型: text、ntext、image 和 cursor。
————————详细介绍————————
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
对于hash相同的,采用链表的方式解决冲突。类似于hashmap。因为索引的结构是十分紧凑的,所以hash索引的查询很快。
举例:
hash索引的限制:
哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
哈希索引只支持等值比较查询,包括=、IN()、<>(注意<>和<=>是不同的操作)。也不支持任何范围查询,例如WHERE price>100。
访问哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值却有相同的哈希值)。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。
如果哈希冲突很多的话,一些索引维护操作的代价也会很高。例如,如果在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大。
---------------------
作者:简之
来源:CSDN
原文:https://blog.csdn.net/olizxq/article/details/82313489
版权声明:本文为博主原创文章,转载请附上博文链接!
SQL Server - 哈希索引的更多相关文章
- SQL Server2014 哈希索引原理
SQL Server2014 哈希索引原理 翻译自:http://www.sqlservercentral.com/blogs/sql-and-sql-only/2015/09/08/hekaton- ...
- SQL Server 深入解析索引存储(下)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
- SQL Server 深入解析索引存储(非聚集索引)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
- SQL SERVER全面优化-------索引有多重要?
想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...
- Sql Server系列:索引基础
1 索引概念 索引用于快速查找在某个列中某个特定值的行,不使用索引,数据库必须从第1条记录开始读完整个表,知道找出需要的行.表越大,查询数据所花费的时间越多.如果表中查询的列有索引,数据库能快速到达一 ...
- SQL Server基础之索引
索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置 ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- SQL Server中的索引
1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Serve ...
- 转载: SQL Server中的索引
http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...
随机推荐
- bzoj3237 cdq分治+可撤销并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=3237 年轻的花花一直觉得cdq分治只能用来降维,不料竟然可以用来分治询问 N<=100000 ...
- pickle详解
一.简介 在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间 Python提供的pickle模块就很好地解决了这个问题,它可以 ...
- maven_常用命令
清理编译好的文件 mvn clean 编译文件(只是编译主目录文件) mvn compile 编译测试文件(也会编译主文件) mvn test 打包 mvn package 将项目发布到本地仓库 mv ...
- my live health
s 盐城的社保咨询服务热线电话:12333 射阳县医疗保险基金中心地址:射阳县合德镇解放东路24号 电话:0515-82322433 社保办事指南:http://yancheng.bendibao.c ...
- nginx做rails项目web服务器缓存配置方法
nginx作为Web服务器.或反向代理服务器都可以使用缓存 一.作为Web服务器 nginx可以通过 expires 指令来设置响应头的过期时间,实现浏览器缓存(Browser Caching),即浏 ...
- Eclipse复制web项目怎么改
在学习中,做一个项目时 , 完成到了某一阶段 实现了部分功能,有必要保存这一项目, 1 在以后的学习中如果能顺利的完成后续部分,可以在需要特定功能时 复习这个项目, (必要性) 2 如果在后续的 ...
- apt-get使用命令
apt-get的卸载命令:remove/purge/autoremove/clean/autoclean apt-get purge / apt-get –purge remove 删除已安装包(不保 ...
- C++模板的使用以及常见问题
最近的数据结构实验频繁地遇到了模板,之前对这一块接触不多,遇到了很多问题,放到这里总结一下. 模板的声明有两种:template <typename Type>或者template< ...
- Linux下的解压命令
Linux下常见的压缩包格式有5种:zip tar.gz tar.bz2 tar.xz tar.Z 其中tar是种打包格式,gz和bz2等后缀才是指代压缩方式:gzip和bzip2 filename. ...
- VS2017 新建win32控制台应用
VS2017的Win32应用比较隐蔽添加新项目,选择项目向导,点击下一步即可看到.