SQLServer内存优化表上的索引

所有内存优化表都至少必须有一个索引,因为行正是通过索引才连接在一起。 在内存优化表中,每个索引也经过内存优化。 内存优化表中的索引与基于磁盘的表中的传统索引在以下几个方面不同:

  • 由于数据行并未存储在页面上,因此既没有页面或盘区集合,也没有为了获取表的所有页面可以引用的分区或分配单元。 虽然可用索引类型之一存在索引页的概念,但它们的存储方式不同于本地表的索引。 它们不会在页面内累积典型的碎片类型,因而不具有填充因子。
  • 在数据控制期间对内存优化表的索引所做的更改绝不会写入磁盘, 只会将数据行和对数据做出的更改写入事务日志。
  • 当数据库重新联机时,将重新生成内存优化索引。
  • 内存优化表的所有索引都是以数据库恢复期间的索引定义为依据进行创建。

索引必须是以下类型之一:

  • 哈希索引
  • 内存优化表的非聚集索引(即 B 树的默认内部结构)

内存优化索引的语法

内存优化表的每个 CREATE TABLE 语句都必须包含索引,可以通过 INDEX 显式添加,也可以通过 PRIMAY KEY 或 UNIQUE 约束隐式添加。

要使用默认 DURABILITY=SCHEMA_AND_DATA 进行声明,内存优化表必须具有主键。 以下 CREATE TABLE 语句中的 PRIMARY KEY NONCLUSTERED 子句满足两个要求:

  • 提供一个索引以满足 CREATE TABLE 语句中至少需要一个索引的最低要求。

  • 提供 SCHEMA_AND_DATA 子句所需的主键。

CREATE TABLE SupportEvent  
(  SupportEventId   int NOT NULL  PRIMARY KEY NONCLUSTERED,  ...  
)  WITH (  MEMORY_OPTIMIZED = ON,  DURABILITY = SCHEMA_AND_DATA);

备注:

对于每个内存优化表或表类型,SQL Server 2014 (12.x)SQL Server 2016 (13.x) 的索引数限制为 8 个。 
自 SQL Server 2017 (14.x) 起,Azure SQL 数据库中不再有内存优化表和表类型专属的索引数量限制。

语法代码示例

本小节包含一个 Transact-SQL 代码块,用于演示在内存优化表中创建各种索引时使用的语法。 代码将演示以下操作:

  1. 创建内存优化表。

  2. 使用 ALTER TABLE 语句添加两条索引:

  3. 插入几行数据。

在这里插入代码片

重复的索引键值

重复的索引键值可能会降低内存优化表的性能。 遍历大多数索引读取和写入操作的条目链的重复系统。 当重复的条目链超过 100 个条目时,性能降低可能可测量。

重复的哈希值

就哈希索引来说,此问题更加明显。 由于以下注意事项,哈希索引受到的影响更大:

  • 每个哈希索引的操作成本更低。
  • 大型重复链与哈希冲突链互相干扰。
  • 要减少索引中的重复,请尝试进行以下调整:

使用非聚集索引。

  • 在索引键的末尾添加其他列,以减少重复项的数量。
  • 例如,可以添加主键中存在的列。

示例改进

以下示例介绍如何避免索引中出现任何性能低效的情况。

假设 Customers 表的 CustomerId 上有主键,列 CustomerCategoryID 上有索引。 通常,在给定类别中将有许多客户。 因此,在索引的给定键内,CustomerCategoryID 将有多个重复值。

在这种情况下,最佳做法是对 (CustomerCategoryID, CustomerId) 使用非聚集索引。 此索引可用于使用涉及 CustomerCategoryID 的谓词的查询,但索引键不包含重复项。 因此,重复的 CustomerCategoryID 值或索引中额外的列不会导致低效的索引维护。

下面的查询显示表 CustomerCategoryID 中的 Sales.Customers索引的平均重复索引键值数,该表位于示例数据库 WideWorldImporters中。

SELECT AVG(row_count) FROM(SELECT COUNT(*) AS row_count FROM Sales.CustomersGROUP BY CustomerCategoryID) a

若要计算自己的表和索引的平均索引键重复项数,请将 Sales.Customers 替换为自己的表名,将 CustomerCategoryID 替换为索引键列的列表。

每个索引类型的使用时机比较

特定查询的性质决定了哪种类型的索引是最佳选择。

在现有应用程序中实现内存优化表时,常规建议是从使用非聚集索引开始,因为其功能更接近于传统聚集索引和基于磁盘的表上的非聚集索引。

非聚集索引使用建议

在以下情况下,非聚集索引比哈希索引更有优势:

  • 查询对索引列使用 ORDER BY 子句。
  • 只测试多列索引第一列的位置的查询。
  • 查询使用 WHERE 子句测试索引列:
    • 不相等:WHERE StatusCode != ‘Done’
    • 值范围扫描:WHERE Quantity >= 100

在以下所有 SELECT 中,非聚集索引比哈希索引更有优势:

SELECT CustomerName, Priority, Description 
FROM SupportEvent  
WHERE StartDateTime > DateAdd(day, -7, GetUtcDate());  SELECT StartDateTime, CustomerName  
FROM SupportEvent  
ORDER BY StartDateTime DESC; -- ASC would cause a scan.SELECT CustomerName  
FROM SupportEvent  
WHERE StartDateTime = '2016-02-26';

哈希索引使用建议

哈希索引主要用于点查阅,而不用于范围扫描。

如果使用相等谓词进行查询,且 WHERE 子句映射到所有索引键列,那么首选哈希索引,而不是非聚集索引,如下面的示例所示:

SELECT CustomerName 
FROM SupportEvent  
WHERE SupportEngineerName = 'Liz';

多列索引

多列索引可以是非聚集索引,也可以是哈希索引。 假设索引列是 col1 和 col2。 如果使用以下 SELECT 语句,只有非聚集索引对查询优化器有用:

SELECT col1, col3  
FROM MyTable_memop  
WHERE col1 = 'dn';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36066.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【汇编语言】标志寄存器(一) —— 标志寄存器中的标志位:ZF、PF、SF、CF、OF 一网打尽

前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优…

【C++】priority_queue优先队列

大家好,我是苏貝,本篇博客带大家了解C的string类的priority_queue优先队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 介绍2. 仿函数(A) 介绍(B) 控制比较逻辑 3. priority_queue和…

Python3 operator 模块

Python2.x 版本中,使用 cmp() 函数来比较两个列表、数字或字符串等的大小关系。 Python 3.X 的版本中已经没有 cmp() 函数,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象,包含的方法有: o…

短视频矩阵系统开发|技术源代码部署

短视频矩阵系统通过多账号运营管理、多平台视频智能分发等功能,助力企业实现视频引流、粉丝沉淀和转化。 短视频矩阵系统是一种创新的营销工具,它整合了多账号管理、视频智能分发、数据可视化等多种功能,为企业在短视频领域的发展提供了强大…

YOLOV11 快速使用教程

概述 这里主要记录使用NVIDIA GPU pytorch 检测系列模型的快速使用方式,可以快速解决一些工业应用的问题,比如:无网、数据大需要改路径、需要记录不同实验结果等问题。 安装 参考官网,自己安装好Python > 3.8和pytorch >…

git修改某次commit(白痴版)

第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…

AI 建站:Durable

网址:https://app.durable.co 步骤 1) 登录 2)点击创建新业务 3)填写信息后,点击创建 4)进入业务 5)生成网站 6)生成完成后不满意的话可以自己调整 7)点击保存 8)发布 …

网络原理之 TCP 协议

目录 1. TCP 协议格式 2. TCP 原理 (1) 确认应答 (2) 超时重传 (3) 连接管理 a) 三次握手 b) 四次挥手 (4) 滑动窗口 (5) 流量控制 (6) 拥塞控制 (7) 延时应答 (8) 捎带应答 3. TCP 特性 4. 异常情况的处理 1) 进程崩溃 2) 主机关机 (正常流程) 3) 主机掉电 (…

Python爬虫之selenium库驱动浏览器

目录 一、简介 二、使用selenium库前的准备 1、了解selenium库驱动浏览器的原理 (1)、WebDriver 协议 (2)、 浏览器驱动(Browser Driver) (3)、 Selenium 客户端库 &#xff0…

Vite+Vue3项目实战:组件化开发与通信指南

一、典型的ViteVue3项目结构 续上文成功创建Vue3项目的脚手架,通过visual Studio Code软件打开刚刚创建的文件夹,将会看到这样一个项目结构。 使用Vite构建Vue3项目时,项目结构通常遵循一定的组织规则,以保持代码的清晰和可维护性…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断  接车后试车,…

团队管理中如何做好目标管理

团队管理中的目标管理是确保团队高效运行的核心要素之一。 在目标管理中,清晰的目标设定、合理的资源分配、实时的跟踪与反馈机制是成功的关键。首先,设定SMART目标(具体、可衡量、可达成、相关性强、时间限定)能够有效聚焦团队的…

【力扣热题100】—— Day4.反转链表

你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了 —— 24.12.2 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出&…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode?二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

记事本建java及java命名规范

1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…

过程管理系统(源码+文档+部署+讲解)

本文将深入解析“过程管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 过程管理系统是一款专为工业设计的综合管理平台,旨在通过集成各种管理流程和功能模块来提高管理效率和安全性。系统提供了从登录系…

期权懂|个股期权交割操作流程是什么样的?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交割操作流程是什么样的? 一、行权申报: 期权买方在行权日通过其经纪商提交行权指令,表明其决定行使期权权利。 二、行权匹配&#xf…

智能仓储:入库业务流程介绍

01 入库流程 入库业务流程,常见过程是这样的: 创建PO单 > 创建到货清单 > 核对货物 > 入库质检 > 货物贴标签 > 上架 > 库存同步 1、创建PO单 po单指的是的采购订单,比如采购了一车货品,这车的货品可以理解…

MySQL并发控制(一):幻读

假设有如下表结构: CREATE TABLE t(id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25); 问:如果执行…

Ubuntu22.04中mysql8 rpm安装

1、安装依赖 sudo apt update sudo apt -y dist-upgrade sudo apt -y install vim net-tools wget gcc make cmake lrzsz sudo apt -y install libmecab2 libjson-perl 2、下载rpm文件 https://dev.mysql.com/downloads/mysql/ https://cdn.mysql.com//Downloads/MySQL-8.0/m…