最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

评论

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

李斯特:不同流派的产品创新方法及创新误区丨创新工作坊

声网

灵感宝盒 RTE NG-Lab

StoneDB 读、写操作的执行过程

StoneDB

MySQL 数据库 大数据 #开源 8月月更

多次拿下移动集团技术发明大奖,TA是怎么做到的?

鲸品堂

AI 资源

系统入门-Linux系统基础命令

Albert Edison

Linux centos 指令 8月月更

超云

Kent Yao

超云 Supercloud

RocketMQ高性能设计之动态缩扩容和消息实时投递

急需上岸的小谢

8月月更

Redis 潜在问题

武师叔

8月月更

底层原理源码+面试场景还原,阿里巴巴多线程JDK源码学习笔记全网首次公开

程序员小毕

程序员 面试 多线程 高并发 jdk源码

中国开源先锋人物志 | ChinaOSC

CCF开源发展委员会

开源生态研究与实践| ChinaOSC

CCF开源发展委员会

leetcode 239. Sliding Window Maximum 滑动窗口最大值

okokabcd

LeetCode 数据结构与算法 双端队列

架构实战营毕业总结

Geek_53787a

开源一夏 |分布式事务

六月的雨在InfoQ

开源 分布式事务 2PC 3PC 8月月更

知识管理体系在企业中的作用

Baklib

开源一夏 |ModelScope--人像卡通化、人像美肤

六月的雨在InfoQ

开源 8月月更 ModelScope

CSS 移动光标使文本产生多个反差色特效

南城FE

CSS css3 前端 动画

备受资本市场关注的Zebec,正在构建“新DeFi”生态

小哈区块

【云原生】SpringCloud-Spring Boot Starter使用测试

java李杨勇

Java web SpringCloud Alibaba 签约计划第三季

备受资本市场关注的Zebec,正在构建“新DeFi”生态

西柚子

开源知识库与SaaS解决方案的区别

Geek_da0866

因果决策从YLearn开始,数据智能基础软件迎“风口”

九章云极DataCanvas

人工智能 GitHub 数据智能 YLearn 工具包

移动端四种热更新技术对比

Geek_99967b

小程序

开源中国专访 TJ:开源许可证,欢迎来到云时代

tapdata

Tapdata 开源社区

【云原生】SpringCloud是什么?

java李杨勇

Java spring-boot 签约计划第三季

“新DeFi”生态的构建,流支付协议Zebec或厚积薄发

BlockChain先知

Github又爆神作!野生程序员自学SpringCloudAlibaba必备学习笔记开源(阿里2022最新版)

Java永远的神

Java 程序员 面试 微服务 SpringCloud

浅谈成功的企业知识管理

Baklib

什么是知识管理系统?如何改善客户体验?

Geek_da0866

基于JavaSpringMVC+vue实现协同过滤电影推荐系统详细设计

java李杨勇

Java spring Vue 3 签约计划第三季 协同过滤

【云原生】微服务SpringCloud-eureka(server)集群搭建

java李杨勇

Eureka spring-cloud 签约计划第三季

Hi,我是ChunJun,一个有趣好用的开源项目

袋鼠云数栈

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