澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:哈希索引原理,内存优化

2019-09-29 作者:数据库网络   |   浏览(124)

SQL Server 贰零壹陆援助哈希查找,客户能够在内部存储器优化表(Memory-Optimized Table)上创办Hash Index,使用Hash 查找算法,达成数量的极速查找。在行使上,Hash Index 和B-Tree索引的分别是:Hash Index 是冬天查找,Index Key必需全方位用作Filter,而B-Tree索引是严守原地查找,不须要Index Key都看成Filter,只必要前序字段存在就可以;在仓库储存结构上,Hash Index使用Hash Table达成,存在Hash 争执,而B-Tree索引的布局是平衡树,存在页拆分,碎片难题。

SQL Server 在执行查询时,自动将运动的相干音讯保存在内部存款和储蓄器中,那几个移动音信称作DMV(Dynamic Management View),DMV记录SQL Server实例品级上的位移音信。由于DMV使用内部存款和储蓄器作为存款和储蓄媒介,在读取DMV时,没有必要IO操作,读写多少速度比很快,不会对Server产生压力,並且DMV直接存款和储蓄在服务器的内部存款和储蓄器中,能够即刻、准确地浮现系统质量的摩登事态。

SQL Server 在实施查询时,自动将活动的连带音讯保存在内部存款和储蓄器中,这一个活动音讯称作DMV(Dynamic Management View),DMV记录SQL Server实例品级上的移动新闻。由于DMV使用内部存储器作为存款和储蓄媒介,在读取DMV时,无需IO操作,读写多少速度十分的快,不会对Server产生压力,而且DMV直接存款和储蓄在服务器的内部存款和储蓄器中,能够及时、正确地突显系统天性的新式状态。

SQL Server二零一六 哈希索引原理

翻译自

跟哈希 join,哈希 聚合的原理同样,明白哈希索引的规律也会同有的时候间掌握哈希 join和哈希 聚合的准绳

 

SQL Server 二零一四生产的的新索引类型叫做 hash index。介绍hash index在此之前一定要介绍哈希函数这样会让我们更理解哈希索引的规律

当五个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树,所以访问速度会更加快

澳门新萄京官方网站 1

 

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

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 二〇一五内部,内部存款和储蓄器优化表创立完事后就不可能再加哈希索引了,不过在 SQL Server 二零一四 里协助表创制完之后增多哈希索引,不过

增多哈希索引是二个离线操作。

 

 

哈希索引的Bucket 数量

( BUCKET_COUNT = 一千00 )定义了哈希索引能够利用的BUCKET数量,那几个Bucket 是定点的同有时间由顾客钦赐Bucket 数量,

实际不是实行查询的时候由SQL Server决定扭转的Bucket 数量。BUCKET数量再三再四2的次方的四舍五入( 1024, 2048, 4096 etc..)

BUCKET_COUNT 的多少明确要安装合适,不然哈希争辨太多,反而质量会减低

 

 

SQL Server二〇一五的哈希索引其实跟MySQL的自适应哈希索引原理其实大致,都是为着摆脱B树的牢笼,使查找作用更加快

澳门新萄京官方网站:哈希索引原理,内存优化表的DMV。How does a relational database work那篇小说也可能有描述hash join的法则,大家可以看一下

澳门新萄京官方网站 2

澳门新萄京官方网站 3

 

 

有关小说

MySQL Adaptive hash index

java HashMap那点事

How does a relational database work

 

如有不对的地点,招待我们拍砖o(∩_∩)o 

一,Hash 查找算法

一,使用DMV的注意事项

一,使用DMV的注意事项

在《数据结构》课程中,Hash查找的算法是:以首要字k为自变量,通过贰个映射函数h,总括出相应的函数值y=h(k)(y称作哈希值,或哈希地址),依照函数值y,将第一字k存款和储蓄在数组(bucket数组)所针对的链表中。在举行哈希查找时,根据重大字,使用同一的函数h计算哈希地址h(k),然后径直寻址相应的Hash bucket,直接到对应的链表中收取数据。由此,Hash 查找算法的数据结构由Hash Bucket数组,映射函数f和数据链表组成,通常将Bucket数组和数据链表称作Hash Table,如图,Hash Table由5个buckets和7个数据结点组成:

1,分明数据保存的日子

1,分明数据保存的年华

澳门新萄京官方网站 4

内部存款和储蓄器是易失性的囤积媒介,一旦SQL Server实例重启,DMV存款和储蓄的新闻将整个重新初始化。在使用DMV时,首先要求检查那几个新闻在内存中保存了多久,以明确DMV数据的可用性。假若SQL Server仅仅运维极短的一段时间,那么对DMV数据实行计算和分析是不确切的,那几个数量不是SQL Server 实例真实专门的事业负荷的数额样本。SQL Server运营的时候越长,DMV中保留的消息就越来越多(当然,DMV十分的小,不会对内部存款和储蓄器产生压力),利用DMV分析就越正确。

内部存款和储蓄器是易失性的积存媒介,一旦SQL Server实例重启,DMV存款和储蓄的消息将一切重新设置。在选拔DMV时,首先要求检讨这么些信息在内部存款和储蓄器中保留了多久,以明确DMV数据的可用性。假诺SQL Server仅仅运营不够长的一段时间,那么对DMV数据开展总结和解析是不适于的,这几个多少不是SQL Server 实例真实工作负荷的数目样本。SQL Server运行的时候越长,DMV中保存的音讯就越来越多(当然,DMV十分的小,不会对内部存款和储蓄器产生压力),利用DMV剖析就越准确。

哈希查找的光阴复杂度是O(n/m),n是指多少结点的多寡,m是bucket的数据,在美丽图景下,Hash Bucket丰硕多,Hash函数不产生重复的Hash Value,哈希查找的年月复杂度最优达到O(1),不过,在实际上利用中,哈希函数有自然的可能率出现重复的哈希地址,爆发哈希争持,时间复杂度会低于O(n/m);在最差的事态下,时间复杂度是O(n)。

2,DMV使用的内部存款和储蓄器有限

2,DMV使用的内存有限

二,Hash Index的结构

DMV能够使用的内部存款和储蓄器体量有限,那使得DMV只好存款和储蓄有限数量的数码。假设SQL Server运转了不短世间,SQL Server Engine会将DMV的一些老多少覆盖。

DMV能够选用的内部存储器体量有限,那使得DMV只好存款和储蓄有限数量的数码。借使SQL Server运转了非常短俗尘,SQL Server Engine会将DMV的一对老多少覆盖。

Hash Index使用Hash查找算法完成,SQL Server内置Hash函数,用于全部的Hash Index,因而,Hash Index正是Hash Table,由Hash Buckets数组和数目行链表组成。创设Hash Index时,通过Hash函数计算Index Key的Hash地址,Hash地址不相同的数据行指向区别的巴克et,Hash地址同样的数量行指向平等的Bucket,假若七个数据行的Hash地址同样,都针对同四个Bucket,那么将那几个多少行链接在一齐,组成七个链表。

二,查看内部存款和储蓄器优化表的DMV

二,查看内部存款和储蓄器优化表的DMV

A hash index consists of an array of pointers, and each element of the array is called a hash bucket. The index key column in each row has a hash function applied to it, and the result of the function determines which bucket is used for that row. All key values that hash to the same value (have the same result from the hash function) are accessed from the same pointer in the hash index and are linked together in a chain. When a row is added to the table, the hash function is applied to the index key value in the row. If there is duplication of key values, the duplicates will always generate the same function result and thus will always be in the same chain.

SQL Server成立一些DMV,用于追踪内部存款和储蓄器优化表的运动消息,在内部存款和储蓄器优化表的DMV中,有三个目的ID(Object ID):

SQL Server创制一些DMV,用于追踪内部存储器优化表的运动音信,在内部存储器优化表的DMV中,有多少个目的ID(Object ID):

举个例子表达,假定哈希函数是h(k)=Length(k),用于总结Index Key的字符个数,在内部存款和储蓄器优化表(Name,City)上创建Hash Index,Index ptr指向链表中的下三个数量行,若无下多少个数量行,那么该指针为NULL:

  • xtp_object_id 是当中的内部存款和储蓄器优化表(Internal Memory-Optimized Table)的ID,在指标的成套生命周期中,该ID可变;
  • object_id 是User Table的ID,独一标志该User Table,在对象的百分百生命周期中,该ID不改变;
  • xtp_object_id 是中间的内部存款和储蓄器优化表(Internal Memory-Optimized Table)的ID,在对象的所有的事生命周期中,该ID可变;
  • object_id 是User Table的ID,独一标记该User Table,在指标的方方面不熟知命周期中,该ID不改变;

澳门新萄京官方网站 5

xtp_object_id 是里面包车型大巴内部存储器优化表的ID(Internal Memory-Optimized Table),每一个User Table都对应二个或多个Internal Table:

xtp_object_id 是内部的内部存储器优化表的ID(Internal Memory-Optimized Table),每二个User Table都对应一个或八个Internal Table:

1,以Name为Index Key创建Hash Index

  • 贰个Interal Table用于存款和储蓄中央数据(Core Data);
  • 任何的Internal Table 用于存款和储蓄有的时候数据,Columnstore Index ,Off-Row(Lob);
  • 详细音讯,请阅读DMV: sys.memory_optimized_tables_internal_attributes
  • 三个Interal Table用于存款和储蓄核心数据(Core Data);
  • 另外的Internal Table 用于存款和储蓄临时数据,Columnstore Index ,Off-Row(Lob);
  • 详细音讯,请阅读DMV: sys.memory_optimized_tables_internal_attributes

第一个数据行的Name是“Jane”,HashValue是4,将该行数据映射到下标为4的Bucket中(Bucket数组的第多少个要素),由于该数据行是第2个数据结点,Index ptr为NULL。

1,查看内存优化表占用的情理内部存款和储蓄器

1,查看内部存款和储蓄器优化表占用的情理内部存款和储蓄器

 澳门新萄京官方网站 6

--memory usage
select tms.object_id
    ,object_schema_name(tms.object_id) '.' object_name(tms.object_id) as table_name
    ,(tms.memory_allocated_for_indexes_kb tms.memory_allocated_for_table_kb)/1024 as total_allocated_mb
    ,tms.memory_allocated_for_table_kb/1024 as table_allocated_mb
    ,tms.memory_used_by_table_kb/1024 as table_used_mb
    ,(tms.memory_allocated_for_table_kb-tms.memory_used_by_table_kb)/1024 as table_unused_mb
    ,tms.memory_allocated_for_indexes_kb/1024 as index_allocated_mb
    ,tms.memory_used_by_indexes_kb/1024 as index_used_mb
    ,(tms.memory_allocated_for_indexes_kb-tms.memory_used_by_indexes_kb)/1024 as index_unused_mb
from sys.dm_db_xtp_table_memory_stats tms
where tms.object_id>0
--memory usage
select tms.object_id
    ,object_schema_name(tms.object_id) '.' object_name(tms.object_id) as table_name
    ,(tms.memory_allocated_for_indexes_kb tms.memory_allocated_for_table_kb)/1024 as total_allocated_mb
    ,tms.memory_allocated_for_table_kb/1024 as table_allocated_mb
    ,tms.memory_used_by_table_kb/1024 as table_used_mb
    ,(tms.memory_allocated_for_table_kb-tms.memory_used_by_table_kb)/1024 as table_unused_mb
    ,tms.memory_allocated_for_indexes_kb/1024 as index_allocated_mb
    ,tms.memory_used_by_indexes_kb/1024 as index_used_mb
    ,(tms.memory_allocated_for_indexes_kb-tms.memory_used_by_indexes_kb)/1024 as index_unused_mb
from sys.dm_db_xtp_table_memory_stats tms
where tms.object_id>0

其次个数据行,Name值是“Greg”,HashValue是4,映射到下标为4的巴克et中,和第贰个数据行链接在一同,组成叁个链表(Chain),插入数据结点时,使用尾部插入法,新的数码节点作为头结点,将头节点的Index ptr(next pointer)指针指向数据链表的第三个数据结点,如图,新的头结点“Greg”的Index ptr指向第三个数据行“Jane”。

2,查看内部存款和储蓄器费用者(Memory Consumer)

2,查看内部存款和储蓄器花费者(Memory Consumer)

 澳门新萄京官方网站 7

每二个MOT皆有单独的Memory Heap,称作VarHeap,是二个Memory Consumer,SQL Server从VarHeap中为MOT的多少分配内部存储器空间。varheap是可变大小的堆数据结构,可以减弱和抓实。VarHeap是由定点数量的Allocation Unit组成的会集。Allocation Unit用于分配一定大小的Page,Page的尺寸是不定点的,最广大的Page Size是64KB。

每一个MOT都有单独的Memory Heap,称作VarHeap,是一个Memory Consumer,SQL Server从VarHeap中为MOT的数额分配内部存款和储蓄器空间。varheap是可变大小的堆数据结构,能够减弱和增加。VarHeap是由定点数量的Allocation Unit组成的聚众。Allocation Unit用于分配一定大小的Page,Page的大小是不固定的,最普及的Page Size是64KB。

2,成立第二个Hash Index,以City为Index Key

VarHeap用于Table Row 和 Bw-Tree Index。每一个LOB列(使用max内定大小)都有和好独自的VarHeap。在创制MOT时,SQL Server决定哪些column存款和储蓄在Table的VarHeap中,哪些column存款和储蓄在投机独立的VarHeap中。

VarHeap用于Table Row 和 Bw-Tree Index。每四个LOB列(使用max钦定大小)都有温馨单独的VarHeap。在开创MOT时,SQL Server决定怎么样column存款和储蓄在Table的VarHeap中,哪些column存款和储蓄在友好单身的VarHeap中。

当成立第二个Hash Index时,每个数据行结构中含有八个Index ptr指针,都用来指向下八个数据节点(Next Pointer):第七个Index ptr用于Index Key为Name的Hash Index,当出现同样的Hash Value时,该指针指向链表中下二个数码行,使数码行链接到一同组成链表;第二个Index ptr用于Index Key为City的Hash Index,指向链表中下三个数据行。

Hash Index 使用其它二个Memory Consumer,称作Hash。

Hash Index 使用其他贰个Memory Consumer,称作Hash。

由此,当成立一个新的Hash Index时,在数据结构上,SQL Server需求成立Hash Buckets数组,并在种种数据行中增添一个Index ptr字段,依照Index Key为Index ptr赋值,组成二个新数据行链表,然则数据行的数目保持不改变。

澳门新萄京官方网站 8澳门新萄京官方网站 9

澳门新萄京官方网站 10澳门新萄京官方网站 11

澳门新萄京官方网站 12

select
    object_schema_name(mc.object_id) '.' object_name(mc.object_id) as table_name 
    ,a.xtp_object_id
    ,a.type_desc as xtp_object_type
    ,iif(a.minor_id=0,'User Table','Off-Row Column:' col_name(a.object_id,a.minor_id)) as xtp_object
    ,mc.memory_consumer_id as consumer_id
    ,mc.memory_consumer_type_desc as consumer_type
    ,mc.memory_consumer_desc as consumer_desc
    ,i.name as index_name
    ,i.type_desc as index_type_desc
    ,mc.allocated_bytes/1024/1024 as allocated_mb
    ,mc.used_bytes/1024/1024 as used_mb
    ,mc.allocation_count
from sys.dm_db_xtp_memory_consumers mc
inner join sys.memory_optimized_tables_internal_attributes a
    on mc.object_id=a.object_id
        and mc.xtp_object_id=a.xtp_object_id
left join sys.indexes i 
    on mc.object_id=i.object_id
        and mc.index_id=i.index_id
where mc.object_id=object_id('[influencer].[Influencers]')
select
    object_schema_name(mc.object_id) '.' object_name(mc.object_id) as table_name 
    ,a.xtp_object_id
    ,a.type_desc as xtp_object_type
    ,iif(a.minor_id=0,'User Table','Off-Row Column:' col_name(a.object_id,a.minor_id)) as xtp_object
    ,mc.memory_consumer_id as consumer_id
    ,mc.memory_consumer_type_desc as consumer_type
    ,mc.memory_consumer_desc as consumer_desc
    ,i.name as index_name
    ,i.type_desc as index_type_desc
    ,mc.allocated_bytes/1024/1024 as allocated_mb
    ,mc.used_bytes/1024/1024 as used_mb
    ,mc.allocation_count
from sys.dm_db_xtp_memory_consumers mc
inner join sys.memory_optimized_tables_internal_attributes a
    on mc.object_id=a.object_id
        and mc.xtp_object_id=a.xtp_object_id
left join sys.indexes i 
    on mc.object_id=i.object_id
        and mc.index_id=i.index_id
where mc.object_id=object_id('[influencer].[Influencers]')

3,Hash 函数

View Code

View Code

在成立Hash Index时,无需编写制定Hash 函数,SQL Server内置Hash函数:

引用:SQL Server In-Memory OLTP Internals for SQL Server 2016

引用:SQL Server In-Memory OLTP Internals for SQL Server 2016

  • 停放的Hash函数发生的HashValue是随意和不得预测的,适用于全数的Hash Index;
  • 内置的Hash函数是精晓的,一样的Index Key总是映射到同一的Bucket;
  • 有料定的概率,两个Index Key会映射到同样的bucket中;
  • 哈希函数是均衡的,爆发的Hash Value坚守泊松分布;

The varheaps are used for both table rows and Bw-tree indexes. (Hash indexes are the only structure used with memory-optimized tables that uses a different memory consumer.) In addition, each LOB, column (specified with the MAX qualifier in the datatype definition) has its own varheap. As mentioned earlier, SQL Server 2016 also supports large columns similar to the row-overflow columns for disk-based tables. For memory-optimized tables, SQL Server will decide when the table is created which of your variable length columns will be stored in the table’s varheap and which will be stored as overflow data and have their own varheap. You can think of LOB and row-overflow columns as being stored in their own internal tables.

The varheaps are used for both table rows and Bw-tree indexes. (Hash indexes are the only structure used with memory-optimized tables that uses a different memory consumer.) In addition, each LOB, column (specified with the MAX qualifier in the datatype definition) has its own varheap. As mentioned earlier, SQL Server 2016 also supports large columns similar to the row-overflow columns for disk-based tables. For memory-optimized tables, SQL Server will decide when the table is created which of your variable length columns will be stored in the table’s varheap and which will be stored as overflow data and have their own varheap. You can think of LOB and row-overflow columns as being stored in their own internal tables.

泊松分布不是均匀遍布,Index Key不是均匀地布满在Hash bucket数组中。举个例子,有n个Hash Bucket,n个分歧的Index Key,泊松遍及发生的结果是:差不离有58%的Hash 巴克et是空的,大致56%的Hash bucket存款和储蓄二个Index Key,剩下54%的Hash Buckets存款和储蓄2个Index Key。

You can examine the metadata for each varheap (and the other memory consumers) in a DMV called sys.dm_db_xtp_memory_consumers. Each memory-optimized table has a row in this view for each varheap and for each hash index. (We will see one more type of memory consumer, called HkCS Allocator, in the section on columnstore indexes on memory-optimized tables.) If we join this DMV with the catalog view called sys.memory_optimized_tables_internal_attributes we can see which varheap belongs to a specific column. Each user table has a unique object_id and xtp_object_id value which is used by all the indexes. Each additional varheap, for the row_overflow and LOB columns will have its own xtp_object_id. Note that if an object is altered, its xtp_object_id will change, but its object_id will not. 

You can examine the metadata for each varheap (and the other memory consumers) in a DMV called sys.dm_db_xtp_memory_consumers. Each memory-optimized table has a row in this view for each varheap and for each hash index. (We will see one more type of memory consumer, called HkCS Allocator, in the section on columnstore indexes on memory-optimized tables.) If we join this DMV with the catalog view called sys.memory_optimized_tables_internal_attributes we can see which varheap belongs to a specific column. Each user table has a unique object_id and xtp_object_id value which is used by all the indexes. Each additional varheap, for the row_overflow and LOB columns will have its own xtp_object_id. Note that if an object is altered, its xtp_object_id will change, but its object_id will not. 

澳门新萄京官方网站 13

3,Hash Index的链表长度

3,Hash Index的链表长度

4,Hash Index的链表长度

对于Hash Index,表示链长的字段有:avg_chain_length 和 max_chain_length ,链长应维持在2左右;链长过大,表明太多的数额行被映射到同样的Bucket中,那会刚毅影响DML操作的属性。

对此Hash Index,表示链长的字段有:avg_chain_length 和 max_chain_length ,链长应维持在2左右;链长过大,表明太多的数据行被映射到均等的Bucket中,那会分明影响DML操作的属性。

昔不近日的Index Key,经过hash函数映射之后,恐怕变化同样的Hash Value,映射到平等的bucket中,发生 Hash 争辨。Hash算法,将映射到一样Bucket的多个Index Key组成多个链表,链表越长,Hash Index查找品质越差。

产生链长过大的因由是:

乃至链长过大的来头是:

在DMV:sys.dm_db_xtp_hash_index_stats (Transact-SQL)中,表示Hash Index链长的字段有:avg_chain_length 和 max_chain_length ,链长应保持在2左右;链长过大,注解太多的数目行被映射到平等的Bucket中,这会精通影响Hash Index的询问质量,导致链长过大的由来是:

  • 总的Bucket数量少,导致分化的Index Key映射到同样的Bucket上;
  • 设若空的Bucket数量大,但链长过大,那注明,Hash Index存在一大波再一次的Index Key;一样的Index Key被映射到平等的bucket;
  • 详细音信,请阅读:sys.dm_db_xtp_hash_index_stats (Transact-SQL);
  • 总的Bucket数量少,导致不一致的Index Key映射到同样的Bucket上;
  • 若果空的Bucket数量大,但链长过大,那注明,Hash Index存在大量重复的Index Key;一样的Index Key被映射到平等的bucket;
  • 详细消息,请阅读:sys.dm_db_xtp_hash_index_stats (Transact-SQL);
  • 总的Bucket数量少,导致不一致的Index Key映射到均等的Bucket上;
  • 倘使空的巴克et数量大,但链长过大,那声明,Hash Index存在大批量双重的Index Key;一样的Index Key被映射到平等的bucket;

4,事务

4,事务

三,创建Hash Index

在访谈MOT时,有两类别型事务ID,在事情中,访谈MOT和拜会DBT的业务是独自的:

在访问MOT时,有三种档案的次序事务ID,在工作中,访谈MOT和拜见DBT的职业是单独的:

在内存优化表上创设Index,无法运用Create Index命令,SQL Server 二〇一五支撑二种艺术开创索引:

  • xtp_transaction_id:是访问MOT的事务ID;
  • transaction_id:是寻访DBT的作业ID,0意味事情未有访谈MOT;
  • 详细音讯,请阅读:sys.dm_db_xtp_transactions (Transact-SQL)
  • xtp_transaction_id:是访问MOT的事务ID;
  • transaction_id:是访谈DBT的工作ID,0表示事情未有访谈MOT;
  • 详细消息,请阅读:sys.dm_db_xtp_transactions (Transact-SQL)

1,在开创内部存款和储蓄器优化表时创设Hash Index

 查看当前数据库中活跃事务的音讯:

 查看当前数据库中活跃事务的新闻:

始建Hash Index的语法是:

select t.xtp_transaction_id
    ,t.transaction_id
    ,t.session_id
    ,t.begin_tsn
    ,t.end_tsn
    ,t.state_desc
    ,t.result_desc
from sys.dm_db_xtp_transactions t
select t.xtp_transaction_id
    ,t.transaction_id
    ,t.session_id
    ,t.begin_tsn
    ,t.end_tsn
    ,t.state_desc
    ,t.result_desc
from sys.dm_db_xtp_transactions t
INDEX index_name [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)  

 

 

创建Hash Index的示例:

参照文书档案:

参谋文书档案:

澳门新萄京官方网站 14澳门新萄京官方网站 15

Baselining with SQL Server Dynamic Management Views

Baselining with SQL Server Dynamic Management Views

--create memory optimized table
create table [dbo].[products]
(
    [ProductID] [bigint] not null,
    [Name] [varchar](64) not null,
    [Price] decimal(10,2) not null,
    [Unit] varchar(16) not null,
    [Description] [varchar](max) null,
    constraint [PK__Products_ProductID] primary key nonclustered hash ([ProductID])with (bucket_count=2000000)
    ,index idx_Products_Price  nonclustered([Price] desc)
    ,index idx_Products_Unit nonclustered hash(Unit) with(bucket_count=40000)
)
with(memory_optimized=on,durability= schema_and_data)
go

Memory-Optimized Table Dynamic Management Views (Transact-SQL)

Memory-Optimized Table Dynamic Management Views (Transact-SQL)

View Code

2,使用Alter Table命令创设Hash Index

alter table [dbo].[products]
add index hash_idx_Products_Name nonclustered hash(name)with(bucket_count=40000);

澳门新萄京官方网站,四,Hash Index的特点

总结Hash Index的特点:

  • Hash Index使用Hash Table协会Index 结构,每一个数目节点都带有三个指南针,指向数据行的内部存款和储蓄器地址;
  • Hash Index是冬季的,符合做单个数据行的Index Seek;
  • 唯有当Hash Index Key全体产出在Filter中,SQL Server才会动用Hash Index Seek操作查找相应的多寡行,假诺缺点和失误放肆三个Index Column,那么SQL Server都会试行Full Table Scan以博取适合条件的数据行。举个例子,创制Hash Index时钦定N个column,那么SQL Server对那N个column总结Hash  Value,映射到相应的bucket上,所以,独有当那N个Column都设不时,才干一定到相应的bucket,进而查找相应的多少结点;

Hash indexes require values for all index key columns in order to compute the hash value, and locate the corresponding rows in the hash table. Therefore, if a query includes equality predicates for only a subset of the index keys in the WHERE clause, SQL Server cannot use an index seek to locate the rows corresponding to the predicates in the WHERE clause.

 

参照文书档案:

Hash Indexes.aspx)

Guidelines for Using Indexes on Memory-Optimized Tables.aspx)

Troubleshooting Common Performance Problems with Memory-Optimized Hash Indexes.aspx)

Linux内核中的hash与bucket

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站:哈希索引原理,内存优化

关键词: