写点什么

内存 OLTP 的索引

  • 2014-02-10
  • 本文字数:1119 字

    阅读完需:约 4 分钟

SQL Server 内存 OLTP 的索引与普通索引不一样。这不一定是坏事,只是你要小心它们的差异,避免造成性能问题。

内存优化的非聚簇索引与基于磁盘的非聚簇索引的不同之处在于,他们一直在涵盖。你不需要指定要包含哪些列,除了真正的索引列,“其它列也都将虚拟地涵盖在内”。

非聚簇索引的一个有趣的限制是它只能单向扫描。比如索引是“OrderDate ASC”时,你不能用这个索引以订单日期降序来检索记录。

另一种类型的索引是内存优化的哈希索引。这种索引是为“点式查找操作(point-lookup operations)”和全扫描设计的。它不能用于排序的扫描和不等式查找操作。微软提供了一些在非聚簇索引和哈希索引之间进行选择的指导原则

  • 如果你只需要执行点式查找,也就是说你只需要获取单独索引键值的记录,则应使用哈希索引。
  • 如果你需要获取一定范围内的记录,或者需要按特定顺序排序的记录,则应使用非聚簇索引。
  • 如果你两个都需要,特别是点式查找比较频繁时,可以考虑建立两个索引。你可以在同一索引键上同时创建哈希索引和非聚簇索引。

哈希索引还需要使用桶计数。桶计数的值应该在 N 到 2N 之间,其中 N 是预期的记录数。在操作层面上,0.2N 到 5N 之间都是“可用”的。桶计数在内部始终会被向上取整到 2 的下一次方。

桶计数过高会浪费内存。对于要完全适合 RAM 的内存优化表而言,这是个敏感问题。而桶计数过低则可能会导致其他问题出现:

如果桶计数显著(十倍)低于唯一索引键的数量,很多桶将有多个索引键。这将导致大多数 DML 操作性能下降,特别是点式查找操作(查找单独的索引键)。比如说,即便索引键字段在 WHERE 子句中,并且使用等号进行 SELECT、UPDATE 和 DELETE 操作,性能也会非常差。

哈希索引可能还会遇到重复值的问题。如果多条记录的索引字段的值相同,那么这些记录会产生哈希冲突。如果这种情况很多,例如每个不同的值重复超过 10 次,那么性能就会受到影响。

对于哈希索引, SQL Server 团队建议将其转换成非聚簇索引。

绝大多数情况下应该使用非聚簇索引,因为如果出现重复,非聚簇索引的性能通常更好。如果采用这个选项,你可以考虑唯一化索引键。如下所述:

对于有大量重复的非聚簇索引,应考虑增加索引列。比如将主键字段加到索引键中,确保索引唯一,也就是说,唯一化索引。

如果值确实不同,并且你仍想使用哈希索引,那么你可以使用“超大索引”, 也就是将桶计数值设置为“唯一索引值数量的 20 到 100 倍之间”,从而减少哈希冲突的可能。

原文英文链接: More on Indexes in In-Memory OLTP


感谢吴海星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-02-10 08:141632

评论

发布
暂无评论
发现更多内容

Django ListView DetailView等基于类的视图如何添加装饰器?

BigYoung

Python django LiveView 装饰器

只需CSS的下拉式导航菜单

寇云

CSS css3

大厂为什么不招30岁以上程序员,看这篇就够了

金刚小书童

程序员 职业规划 技术管理 职业成长

Spring源码

云淡风轻

spring 源码

JUC整理笔记四之梳理VarHandle(上)

JFound

Java

贴吧电纸书资深用户,从7个方面详谈BOOX Poke2上手体验!

DT极客

python实现·十大排序算法之桶排序(Bucket Sort)

南风以南

Python 排序算法 桶排序

2020年5月30日 泛型程序设计

瑞克与莫迪

不忘初心,继续努力

一周思进

ARTS 打卡计划

Spring Bean生命周期——初始化和销毁

xiaoxi666

Java spring

广告的发展历程

子悠

广告 计算广告 广告系统 互联网广告 RTB

毫无意义的人生唯有编织图案

xyz

ARTS-week-1

youngitachi

ARTS 打卡计划 arts

如何存储1个二进制位&锁存器的核心和本质

姜海天

计算机 数字逻辑

Vite for Vue 是什么?

꯭🇫꯭

Vue vuejs vite Vue3

写给产品经理的信(6):时间管理

punkboy

极客时间,项目管理 职场 产品经理 时间分配 时间管理

【CSS】为什么a标签的伪类选择器要注意书写顺序?

德育处主任

CSS html css3 大前端 Web

Vol.10 Java 25岁了!

pyfn2030

Java jdk 编程语言 Java25周年

平台化服务的基石:权限模型设计

孤岛旭日

企业架构 用户权限 数据建模

面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

程序员柠檬

微服务 后台开发 架构设计

设计模式:建造者设计模式

毛佳伟🐳

图片与标题的Ken Burns动效

寇云

CSS css3

vue-router 容易被忽视的几个地方

꯭🇫꯭

Vue vuejs vue-router router

恭喜你,赢得了爱情长跑的胜利

小天同学

爱情 兄弟 祝福

Cassandra可调一致性的使用及原理

老任物联网杂谈

大数据 分布式 Cassandra 可调一致性

终于找到了一篇文章!通俗地讲解计算机工作原理

图灵社区

cpu 存储器 编译器 计算机工作原理

谈谈控制感(11):这样提升控制感,谁都能做到

史方远

心理 成长

关于字符编码那些你应该知道的事情

꯭🇫꯭

Java MySQL emoji utf-8 ASCII

产业区块链:产业是本质,区块链是工具

CECBC

新基建 CECBC 区块链技术 中国电子

一位测试工程师的自我介绍

姬翔

测试

SpringBoot之多模块开发

北漂码农有话说

内存OLTP的索引_语言 & 开发_Jonathan Allen_InfoQ精选文章