QCon 演讲火热征集中,快来分享你的技术实践与洞见! 了解详情
写点什么

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

评论

发布
暂无评论

网络安全等保:Oracle数据库测评

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

PP-OCR

春秋易简

AI产业化加速时代,中国大学生何以勇攀时代高峰?

脑极体

自定义 View:三维旋转

Changing Lin

10月月更

未来云原生 | CIF 论坛精彩看点

CODING DevOps

DevOps 云原生 数字化 标准化 腾讯云 CIF 峰会

MyBatis原生批量插入的坑与解决方案!

王磊

mybatis springboot

听说,99% 的 Go 程序员都被 defer 坑过

AlwaysBeta

golang defer panic recover Go 语言

第1周作业

危险游戏

架构实战营

2021年南通市正规等保测评机构有几家?叫什么名称?

行云管家

网络安全 等级保护 等保测评

科技热点周刊|GitLab 上市、LinkedIn 中国停止运营、Visual Studio 2022 正式版将发布

青云技术社区

云计算 云原生 云安全

BFE Ingress Controller正式发布!

百度开发者中心

负载均衡 云原生 开源技术 kurbernetes ingress

Java 面试八股文之数据库篇(二)

Dobbykim

在体制内做事的八个建议

石云升

学习笔记 职场经验 10月月更

崎岖的矿山路:无人矿卡的那些难题与智变

脑极体

音视频:H.264与H.265编码

程序员架构进阶

视频编解码 视频流 H.265 10月月更

架构师训练营模块一作业

CheneyWang

架构实战营

Bazel构建Android项目

轻口味

android 10月月更

HTTPS 协议到底比 HTTP 协议多些什么?

JackTian

https 网络协议 网络 HTTP 网络工程师

官方线索|第十三届中国开源黑客松

轻口味

1024我在现场

现成存币生息钱包软件系统开发模板

持币生息钱包软件系统开发资料(源码)

JavaScript 中优雅处理对象的6个方法

devpoint

JavaScript Object 10月月更

行云创新即将出席2021云栖大会,共话云原生

行云创新

云原生 阿里 开发 行云 云栖大会

一个人如何又快又好的管理多台windows server服务器?

行云管家

服务器 运维监控 运维管理

分析型CRM软件能帮到你什么?

低代码小观

企业 企业管理 CRM 管理工具 系统管理

制造业中的云计算:从不可能到不可或缺

云计算

官方线索|1024 51CTO 程序员嘉年华

穿过生命散发芬芳

1024我在现场

音视频学习 -- 弱网对抗技术相关实践

声网

音视频 网络 实时视频

模块一作业

bob

「架构实战营」

协作型CRM软件能帮到你什么?

低代码小观

企业 企业管理 CRM 管理系统 管理工具

MySQL 数据存储/索引/事务隔离级别/主从复制/分库分表

赖猫

c++ MySQL 数据库 后台开发 后端

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