写点什么

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

评论

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

应用系统日志打印规范实践之道

陈俊

日志 规范

C++运算符重载(五)之关系运算符重载

CtrlX

c c++ C# 重载 8月月更

Go-Excelize API源码阅读(九)——SetSheetBackground(sheet, picture string)

Regan Yue

Go 开源 源码解读 8月日更 8月月更

废除“网络君主制”,认识 Usenet ~

掘金安东尼

前端 网络 8月月更

超新概念出炉,JDK17的封闭类使用解析

知识浅谈

8月月更

开源一夏|OpenHarmony视频播放器

坚果

开源 OpenHarmony 8月月更

PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!

Python猫

STM32入门开发 编写DS18B20温度传感器驱动(读取环境温度、支持级联)

DS小龙哥

8月月更

Android进阶(十二)Fragment与Activity讲解

No Silver Bullet

android Activity Fragment 8月月更

SpringCloud OpenFeign 请求重试

程序知音

Java spring 程序员 微服务 SpringCloud

如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

PivotalCloud

千万级学生管理系统的考试试卷存储方案

张立奎

【云原生】Spring Cloud Alibaba 之 Feign 远程调用 实战

Bug终结者

分布式 微服务 云原生 8月月更

95后跳槽阿里网晒工资条:多亏面试前补了这个,真香

程序猿阿宇

Java java程序员 大厂面试 大厂面经 内推

五分钟搞定YAML

俞凡

云原生 yaml

计算机网络知识点全面总结(一篇全懂)

C++后台开发

网络编程 计算机网络 网络协议 底层原理 C/C++开发

大逆不道,从天界偷下来的算法修仙秘籍竟然传到你手上~~(结尾有彩蛋)

武师叔

数据结构与算法 有趣的技术知识 复杂度分析 签约计划第三季 8月月更

【LeetCode】检查数组是否存在有效划分Java题解

Albert

LeetCode 8月月更

TE数字化共创之路 | 这场旅程,从数字化共创平台开始

明道云

体验家辛济云:CEM不是MarTech,不仅要“从0到1”,更要规避“从1到0”

B Impact

使用 JavaScript Promise 读取 Github 某用户的数据

汪子熙

JavaScript Promise 异步编程 Javascript框架 8月月更

3-6月面经总结,200多页真题笔记和详解(含核心考点及6家大厂)

程序猿阿宇

Java java程序员 大厂面试 秋招 大厂面经

史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)

自然

多线程 并发 8月月更

React Server Components 介绍 亮点

HullQin

CSS JavaScript html 前端 8月月更

Kubernetes宕机切换源码分析

Jason黄

源码分析 kubelet Kubernetes 集群 宕机

美团二面:如何解决 bin log 与 redo log 的一致性问题

飞天小牛肉

签约计划第三季

MySQL 原理与优化:意向锁,IS,IX

老崔说架构

Java技术专家成长路线总结(思维导图)

程序猿阿宇

Java java程序员 大厂面试 秋招 大厂面经

JSON 基本使用

兮动人

json

知乎疯传,吹爆阿里P7《K8s+Jenkins》的技术手册

程序知音

Java 编程 程序员 后端技术 #k8s

史上最全的Java并发系列之Java中的线程池

自然

线程池 并发 8月月更

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