写点什么

内存 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:141495

评论

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

OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

阿里巴巴云原生

阿里云 开源 云原生 openyurt

[力扣] 剑指 Offer 第三天 - 替换空格

陈明勇

Go 数据结构与算法 力扣 11月月更

JAVA concurrency -- ArrayBlockingQueue源码详解

骑牛上青山

Java 源码

链路状态路由协议 OSPF (一)

我叫于豆豆吖.

11月月更

算法题学习---单链表的排序

桑榆

算法题 11月月更

简单时序逻辑电路

芯动大师

Verilog 11月月更 锁存器

用户体验成为继MAU后,手机银行竞争分化的下一分水岭,易观千帆重磅发布手机银行APP用户体验GX评测

易观分析

App 手机银行

爬虫基本原理介绍、实现以及问题解决

石臻臻的杂货铺

爬虫

OSPF路由协议一

初学者

11月月更

Redis LRU 内存淘汰算法大有玄机

码哥字节

LRU Redis 6.0

2022昇腾AI创新大赛圆满收官,看这届评委怎么说?

极客天地

分布式系统中的哈希算法

骑牛上青山

数据结构 分布式 算法 哈希

动态路由协议(二)

我叫于豆豆吖.

11月月更

东方通Tongweb中间件Linux环境部署

@下一站

技术 中间件 linux 文件权限控制 Java core 11月月更

HIFIVE音加加:多场景音乐版权解决方案,让「用音乐」更便捷

曲多多(嗨翻屋)版权音乐

版权保护 视频后期 数字版权保护

一场算力集结令,国产芯片如何开启冲刺跑?

脑极体

融云「百幄」之数字人,升级交互体验的「新同事」

融云 RongCloud

AI 通信 数字化

重塑感知,荣耀金洋!金洋奖两项用户体验奖项公布

易观分析

App 手机银行

助力车路云一体化,EMQ在车路协同领域的应用实践

EMQ映云科技

物联网 IoT emq 11月月更 车路协同

JAVA concurrency -- ThreadLocal 源码详解

骑牛上青山

Java 源码

一次zuul版本升级产生的问题排查记录

骑牛上青山

Java spring 源码 Zuul 生产环境

使用gitflow时如何合并hotfix

Geek_pwdeic

通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录

王中阳Go

Go golang 高效工作 学习方法 11月月更

L1、L2范数理解--Ridge以及Lasso回归

Studying_swz

深度学习 11月月更

JAVA concurrency -- ReentrantLock 源码详解

骑牛上青山

Java 源码

JAVA concurrency -- CyclicBarrier 与 CountDownLatch 源码详解

骑牛上青山

Java 源码

jvm(二)内存管理与虚拟机执行子系统

想要飞的猪

java对象内存布局 jvm加载子系统

动态路由协议(一)

我叫于豆豆吖.

11月月更

流程表单初体验

江南一点雨

Java spring springboot flowable

为什么要做用户留存分析

穿过生命散发芬芳

用户留存 11月月更

2022下半年《软考-系统架构设计师》备考经验分享

劼哥stone

软考 系统架构师

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