zoukankan      html  css  js  c++  java
  • 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    flare3d_plane
    flare3d_TextureFilter
    flare3d_animation
    flare3d黄色星球案例再次解读整理
    pureMVC(二)
    flare3d_ColladaLoader
    flare3d_clone
    四则运算
    15章
    带界面的四则运算
  • 原文地址:https://www.cnblogs.com/frankcui/p/10477904.html
Copyright © 2011-2022 走看看