前瞻性的索引设计

news2024/10/10 14:37:21

目录

介绍两个快速、易用的技术:基本问题法(BQ)和快速上限估算法(QUBE)

发现不合适的索引

基本问题法

对每个SELECT语句,以下问题的答案都必须按下述步骤来考虑

如何确定一个方案能否让SELECT在最差输入的情况下仍然运行的足够快

注意

快速上限估算法

服务时间

排队时间

基本概念:访问

读取一组连续的索引行

读取一组连续的表行

计算访问次数

随机访问

顺序访问

FETCH处理

关于QUBE应在何时使用的讨论

介绍两个快速、易用的技术:基本问题法(BQ)和快速上限估算法(QUBE)

发现不合适的索引

        一旦一个应用的明细方案确定下来,我们就应该确认当前的索引对新的应用来说是否合适。这里考虑两种简单、快速并且可行的方法:

        (1)基本问题法(BQ)

        (2)快速上限估算法(QUBE)

基本问题法

对每个SELECT语句,以下问题的答案都必须按下述步骤来考虑

        问:是否有一个已存在的或者计划中的索引包含了WHERE子句所引用的所有列?

        答:

        (1)如果否,那么我们应当考虑将缺少的谓词列加到现有的索引上去。这将产生一个半宽索引,尽管索引的等值匹配过程并不让人满意(一星),但是索引过滤确保回表访问只发生在所有查询条件都满足的时候;

        (2)如果这还达不到足够的性能,那么下一个选择是将所有涉及的列都加到索引上,以使访问路径只需要访问索引。这将产生一个避免所有表访问的宽索引;

        (3)如果SELECT仍然很慢,就使用第四章所介绍的两个候选索引算法来设计一个新的索引。

如何确定一个方案能否让SELECT在最差输入的情况下仍然运行的足够快

        可以每次创建一个索引,用最差输入来测试响应时间。为了确保测得的响应时间接近于正常生产库上运行的性能表现,还必须把缓冲池考虑进来,并观察每个事务的缓冲池命中率。测试的第一个事务很可能在缓冲池中并没有相应的缓存页,所以最差输入下的磁盘读的指标会比正常环境的要高。此外,第一个访问索引的事务必须等待文件被打开。而另一方面,如果变量的输入值保持不变,那么第二个访问该索引的事务将很可能会获得100%的缓冲命中率。

        为了获得具有代表性的响应时间,每个索引方案都应在进行过预热事务之后再开始测试,可以通过传入一些典型的输入值(但不是最差情况的值)来打开文件,并将大部分非叶子索引页加载到数据库的缓冲池中。这样,使用最差输入值的事务就会有一个比较有代表性的响应时间了,至少已经把CPU和磁盘读的服务时间考虑进来了。

        如果模拟测试和QUBE方法都没有实施,那么应当使用宽索引的方案,并在应用切换到生产环境后立即启用异常报告来发现那些连宽索引都无法满足性能要求的场景。

注意

        BQ的目的只是确保我们至少可以通过索引过滤来最小化对表的访问,除此以外没有其他的作用。

快速上限估算法

        在最初的评估阶段(当前索引是否让select足够快?),QUBE比BQ更耗时,但它能揭示所有索引或者表设计相关的性能问题:假设对每个谓词所用的最差过滤因子都非常接近于实际的最差情况过滤因子值。根据定义,QUBE方法是悲观的(上限),它有时会有警告误报,但它不会像Q那样漏掉某些未发现的问题。

        QUBE的目的是在一个非常早的阶段将潜在的慢访问路径问题暴露出来。为了能在实际项目中使用,任何语句级别的预测公式都必须足够简单,这样才能将评估过程的额外开销保持在一个可以接受的程度。

        这个快速估算法的输出结果是本地相应时间(LRT),即在数据库服务器中的耗时。

服务时间

        在简单的场景下(I/O时间与CPU时间不重叠),服务时间等于CPU时间加上了排除磁盘驱动排队的随机读时间。如果没有资源竞争,则本地响应时间等于服务时间。

排队时间

        在一个常规的多用户环境中,程序的并发会导致对所需资源的各种竞争,因此这些并发程序不得不排队来获取这些资源。以下资源在LRT的范畴内:

        (1)CPU排队时间(所有处理器都忙着处理更高优先级的任务)

        (2)磁盘驱动器排队(包含请求页的驱动器处于繁忙状态)

        (3)锁等待(请求的表或行被锁定在一个不兼容的级别)

        (4)多道编程的级别、线程数或其他方面已经达到了上限(这些都是为了防止资源过载而设置的系统值)

        QUBE会忽略除磁盘驱动排队外的其他所有类型排队,以提供一个简单的评估过程,用于评估那些对性能影响特别大的方面。

        在排除上诉因素后,我们得到的是一个非常简单的估算过程,仅需两个输入变量,TR和TS,必要时还有第三个输入变量F。这些就可以将SQL的处理及I/O成本考虑进来嘞,并且他们是影响索引设计的主要因素。

基本概念:访问

        根据定义,DBMS读取一个索引行或一个表行的成本称为一次访问:索引访问或表访问。如果DBMS扫描索引或表的一个片段(被读取的行在物理上是相邻的),那么第一次的读取即为一次随机访问。对于后续行的读取每一行都是顺序访问。在当前的硬件条件下,顺序访问的成本比随机访问要低得多。一次索引访问的成本与一次表访问的成本基本上是相同的。

读取一组连续的索引行

        物理上彼此相邻是指所有行都通过指针链接在一起,链接的先后顺序由索引的键值严格定义。当几个索引行键值相同时,就根据索引行存储的指针值进行链接。

        现在,读取一组连续的索引行非常快,一次磁盘旋转会将多个叶子页读取进内存中,而且只有在磁盘指针移到下一个柱面时才需要进行一次短暂的寻址。

        不过这个完美的顺序还是会被打破的,至少有以下三个影响因素:

        (1)如果一个叶子页没有足够的空间存储新插入的索引行,那么叶子页就必须被分裂。之后链表仍会按照正确的顺序链接索引行,但是这与底层的物理存储顺序就不再一致了,一些“按道理”应该是顺序的访问就变成随机访问了。不过索引的重组可以再次恢复最理想的顺序。

        (2)意想不到的数据增长可能会填满原本连续的空间(区或者类似的概念)。操作系统于是会寻找另外一个连续的空间,并将它链接到原来空间的后面。这时候从第一个区到第二个区的访问就是产生一次随机访问。

        (3)RAID5条带会将前几个叶子页存储在一个驱动器上,将后面的叶子页存储在另外的驱动器上。这就会产生额外的随机读。但实际上条带的积极作用要大于随机读带来的性能恶化。一个智能的磁盘服务器可以将后续的叶子页并行的从多个驱动器读取至磁盘缓存中,从而大大降低了单个叶子页的I/O时间。此外,在RAID5条带策略下,一个被频繁访问的索引不太可能导致某一个磁盘负载过高,因为I/O请求会被均匀的分不到RAID5阵列内的多个磁盘驱动器上。

        忽略上述情况,我们仍然假设,如果两个索引行在链表上彼此相邻(或者在非唯一索引中,相同键值的行指针彼此相邻),那我们就认为这两行在物理上页相邻。这就意味着QUBE认为所有的索引都有最理想的顺序。

读取一组连续的表行

        读取一组连续的表行有如下两种情况:

        (1)全表扫描:从表页1开始,读取该页上所有记录,然后再访问表页2,以此类推。按照记录在表页中存储的顺序进行读取,没有其他特殊的顺序。

        (2)聚簇索引扫描:读取索引片上的第一个索引行,然后获取相应的表行,在访问第二个索引行,以此类推。如果索引行与对应的表行记录顺序完全一致(聚簇率100%),那么除了第一次外的所有表访问都是顺序访问。

        存储表的传统方式跟索引一样,也是将所有的表页保留在一个连续的空间内。引起顺序杂乱和碎片化的因素也于索引中的相似,但有两个地方不同:

        (1)如果往表中插入的记录在聚簇索引所定义的主页中装不下,则通常不会移动现有的行,而是将新插入的记录存储在离主页尽可能近的表页中。对第二个页的随机I/O会使聚簇索引扫描的更慢,但是如果这条记录离主页很近,这些额外的开销可以被避免,因为顺序预读功能会一次性将多个表页装载到数据库缓存中。

        (2)一条记录被更新之后,可能会因为表行过长而导致其无法存储在当前表页中,这时DBMS就必须将该行记录迁移到另一个表页中,同时在原有的表页中存储指向新表页的指针。当该行被访问时,这将引入额外的随机访问。

        表可以通过重组来还原行记录的顺序,从而减少不必要的随机访问。QUBE假设所有的行、索引都是以最理想的顺序组织的。

        根据QUBE的定义,扫描索引或者表的一个片段只需进行一次随机访问。数据库专家们需要对重组的必要性进行监控,以保证我们所做的乐观假设都是合理的。

计算访问次数

随机访问

        首先思考一下磁盘读和随机访问的区别。一次磁盘读所访问的对象是一个页,而一次访问的访问对象则是一行。一次随机磁盘读会将一整页读取至数据库的缓冲池中,但是根据定义,前后两次的随机读不太可能会访问到同一页。因此,QUBE中单次随机访问所消耗的时间与一次磁盘读的平均耗时是一样的,都是10ms。虽然随机读是同步的,但是由于现在的处理器速度非常快,所以在估算单次访问的开销时可以忽略CPU时间,这一CPU时间通常小于0.1ms。

顺序访问

        一次顺序访问是指读取物理上连续的下一行,这一行在同一页或下一页中。由于顺序读的CPU时间与I/O时间是重叠的,因此顺序访问的消耗时间就是两者中较大的那个。在QUBE中,一次顺序读所消耗的时间是0.01ms。

        当计算访问次数时,为了简单起见,我们会遵循以下规则:

        (1)忽略索引的非叶子页。我们假定它们都在数据库的缓冲池中,或者至少在磁盘服务器的读缓存中;

        (2)假设DBMS能够直接定位到索引片的第一行(忽略为了定位索引行位置而使用二分查找或者其他技术所消耗的时间);

        (3)忽略跳跃使顺序读所节省的任何时间;

        (4)假设所有的索引和表都处于理想的组织顺序。

        顺序访问的时间(0.01ms)是数据库在判断是否接受一行时所做的必要处理的时间。

FETCH处理

        被接受的行的数量可以通过FETCH调用的次数来确定(除非多行FETCH可用),这些行将经历更多的处理程序。

        如果QUBE被用来比较可选的访问路径,比如比较全表扫描和使用特定索引,那么F参数是无关紧要的,只需要考虑TR和TS。但如果使用QUBE来确定LRT,F参数就可能会比较重要。

        在处理被接受了的行时,可能会涉及排序操作,排序的整体开销通常与FETCH行数成正比。大多数情况下,排序的开销非常小。

关于QUBE应在何时使用的讨论

        理想情况下,QUBE应当在新方案的设计过程中使用。QUBE甚至可以在设计程序之前就开始使用,只需要简单的知道数据库一定会处理的最差输入场景即可。事实上,直到估算结果令人满意时再开始设计程序是非常明智的做法。有时,我们还必须设计较为复杂的程序结构以满足性能的要求。

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

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

相关文章

PostgreSQL 专栏已全部完成

PostgreSQL 专栏历时近半年,终于完成了。 目前已整理成册,可以看下截图: 目录预览 目录 01 预览: 目录 02 预览: 目录 03 预览: 目录 04 预览: 目录 05 预览: 目录 06 预览&…

罗格科技:全球税务服务领域初露锋芒 罗格罗拉国际税大模型发布

近年来,随着全球数字经济和跨境电商的迅猛发展,税务问题已成为中国企业出海过程中不可忽视的重要环节。为了帮助企业应对国际税务挑战,国内领先的数据科学与税务科技服务供应商罗格科技,携其最新成果——罗格罗拉国际税大模型&…

[内容转载] 微信全平台开源终端数据库WCDB迎来重大升级!

第一次看到这么详实的文章,转给大家看看,很多提出问题和如何解决问题的方法因为太细了,就没有完全转载,感兴趣的可以去看原文。 一、简介 WCDB 是微信团队开源的一款基于 SQLite 的终端数据库。自 2017 年 6 月开源以来&#xff…

【C++】STL——stack和queue

目录 前言容器配接器(适配器)stack的使用stack的模拟实现queue的使用queue的模拟实现双端队列(deque) 前言 前面我们已经学习了STL容器中的string、vector还有list。 【C】string的模拟实现 【C】STL——vector的模拟实现 【C】S…

gradle降级

文章目录 引子编译错误参考 引子 项目引入了一个高版本项目改造,编译运行失败,提示如下错误,解决方案要么升级gradle版本,升级适配改各种方法配置,现有的项目存在适配问题;要么就是版本降级。 本文以介绍…

docker环境redis启动失败

现象&#xff1a; 查看日志错误为 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 经查询为aof文件损坏导致&#xff0c;修复aof即可 解决方法&#xff1a; 1.查看执行的docker命令&…

c到c++衔接速成

温馨提示&#xff1a;本篇文章乃博主多次学习后的总结&#xff0c;其中一些专业名词的概念不会做介绍&#xff0c;本篇文章只解决实操问题 c到c中&#xff0c;语法上得到了许多升级&#xff0c;那么哪些地方升级了&#xff0c;我们来快速复习一下 目录 头文件的升级 命名空间…

国产长芯微LDC5791是一款单通道、20位、无缓冲电压输出DAC完全P2P替代AD5791

描述 LDC5791是一款单通道、20位、无缓冲电压输出DAC&#xff0c;采用最高33 V的双极性电源供电。正基准电压输入范围为5 V至VDD – 2.5V&#xff0c;负基准电压输入范围为VSS 2.5 V至0 V。相对精度最大值为1 LSB&#xff0c;保证工作单调性&#xff0c;差分非线性(DNL)最大值…

基于echarts的旅游信息(游客行为分析)大数据可视化平台(echarts+Django+MySQL+Scrapy框架爬虫;程序+论文+开题报告)

摘要 本论文旨在研究Python技术和ECharts可视化技术在游客行为分析系统中的应用&#xff0c;通过对旅游数据的深入分析&#xff0c;希望能够揭示出南京旅游市场的现状和趋势&#xff0c;从而为游客提供更优质的旅游体验&#xff0c;也可以为政府和旅游企业制定更加科学和有效的…

Spring事务的1道面试题

每次聊起Spring事务&#xff0c;好像很熟悉&#xff0c;又好像很陌生。本篇通过一道面试题和一些实践&#xff0c;来拆解几个Spring事务的常见坑点。 原理 Spring事务的原理是&#xff1a;通过AOP切面的方式实现的&#xff0c;也就是通过代理模式去实现事务增强。 具体过程是…

2024年诺贝尔物理学奖

2024年&#xff0c;诺贝尔物理学奖没有颁给物理学家&#xff0c;而是授予了两位计算机科学家&#xff0c;表彰他们在神经网络领域的开创性工作&#xff0c;这项研究成为了我们今天所称的人工智能的基础。这标志着物理学与计算机科学之间的深度融合。 获奖者约翰霍普菲尔德和杰弗…

财政警钟敲响!CBO预测:美国2024财年赤字预计达1.8万亿美元

KlipC报道&#xff1a;美国国会预算办公室&#xff08;CBO&#xff09;近日发布报告显示&#xff0c;2024财年&#xff08;2023年10月1日至2024年9月30日&#xff09;&#xff0c;美国联邦政府预算赤字高达1.8万亿美元&#xff0c;与上一财年相比增加了1390亿美元。据CBO预测&a…

转型AI产品经理需要掌握的硬知识、经理能力模型和常见AI概念梳理

近几年&#xff0c;从亚马逊&#xff0c; Facebook&#xff0c;到谷歌&#xff0c;微软&#xff0c;再到国内的BAT&#xff0c;全球最具影响力的技术公司都将目光转向了人工智能&#xff08; AI &#xff09;。2016年 AlphaGo 战胜李世石&#xff0c;把公众的目光也聚集到了人工…

IROS24新鲜出炉:PRL-Track,最先进的无人机视觉目标跟踪系统!

导读&#xff1a; 近年来&#xff0c;随着无人机技术的飞速发展&#xff0c;视觉目标跟踪在无人机的自主应用中扮演着越来越重要的角色&#xff0c;然而&#xff0c;在复杂多变的环境中&#xff0c;实现高精度的目标跟踪并非易事。无人机在飞行过程中&#xff0c;常常会遇到目标…

介绍几个电池充电管理芯片(TP4056、SGM40561)

TP4056 上一篇我们介绍了个TP4055&#xff0c;那么跟TP4055相比&#xff0c;TP4056肯定是做了升级的。 首先是有最高1000mA的充电电流&#xff0c;而TP4055是500mA。 一般来说我们尽可能的让充电电流接近电池容量的一半&#xff0c;这样对电池比较好。 充电电压都是4.2V。 …

winform实现托盘语音提醒

测试环境: visual studio 2022 window 10 .net framework 4.6 本文实现的功能有&#xff1a; 1 托盘最小化 2 语音定时播放 3 检测到操作系统被客户点静音后&#xff0c;需要程序控制开启音量(在运行过程中&#xff0c;由于语音重复播放&#xff0c;客户很烦&#…

【Protobuf】基本使用总结+项目实践

概述 序列化与反序列化 网络传输中使用&#xff0c;可以实现将对象转换为二进制序列&#xff0c;然后将二进制序列转换为对象&#xff0c;这一个交互的过程就是序列化。生成的数据&#xff0c;持久化存储到磁盘上的过程&#xff0c;也需要经过序列化和反序列化才可以实现。 序…

SpringBoot实现的美发门店客户关系管理(CRM)系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

浅谈2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者

目录 1.概述 1.1. 跨学科的融合 1.2. 推动科学研究的工具 1.3. 对科学界的激励 1.4. 技术的社会影响 2.机器学习与神经网络的发展前景 2.1.具体应用与作用 2.1.1. 医疗健康 2.1.2. 金融 2.1.3. 制造业 2.1.4. 交通与物流 2.1.5. 零售 2.2.未来展望 2.3.科学研究与…

C# 实现调用函数,打印日志(通过反射代理、非IOC)

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…