如何评估QUERY的响应时间?

背景

如何评估QUERY的响应时间?

需要买什么样的硬件能满足为了业务XXX的需求?

这种问题在企业中非常常见,但是估计大多数是拍脑袋的回复,做得更好点,可能是根据业务的benchmark提供的数据,给一个拍脑袋的决定。

本文将针对数据库的QUERY展开,看看应该如何正确的评估QUERY的响应时间。

从执行计划谈起

对于数据库来说,比如PostgreSQL,支持非常多的access method,以及非常多的运算路径和方法。

每种方法或路径都有对应的成本评估算法。

算法可参考
src/backend/optimizer/path/costsize.c

不同的path,算法不同,算法中的因子也各不相同。

例如,全表扫描path,成本取决于需要扫描的块的多少,扫描每个块的成本;以及需要获取的记录数的多少,获取每条记录需要消耗的成本是多少。

评估QUERY的响应时间,与数据库优化器评估COST的道理是想通的。

你可以参考一下文档,planner如何使用统计信息评估path成本,里面有很多例子。
https://www.postgresql.org/docs/9.5/static/planner-stats-details.html

场景引入

一张业务表有15个字段,平均行长度为100字节,其中有一个PK字段为INT类型,当数据量达到10000亿时,使用PK查询1条记录需要多久的响应时间?

这个场景其实蛮简单的,就是基于PK的查询。

执行计划也很简单

postgres=# create table tt1(id int primary key, c1 text, c2 text, c3 int, c4 int, c5 timestamp, c6 inet, c7 int4range, c8 point, c9 float8, c10 tsvector, c11 tsquery, c12 line, c13 box, c14 int[], c15 interval);
CREATE TABLE

postgres=# explain select * from tt1 where id=1;
                              QUERY PLAN
----------------------------------------------------------------------
 Index Scan using tt1_pkey on tt1  (cost=0.14..8.16 rows=1 width=340)
   Index Cond: (id = 1)
(2 rows)

按照索引扫描的path,成本分为

  • 扫描索引块的成本
  • 扫描HEAP块的成本
  • 索引 get tuple cpu成本
  • heap get tuple cpu成本

基于PK的扫描,相比IO的成本,cpu的成本几乎可以忽略。

所以我们只需要评估出需要扫描多少个数据块,就可以大致评估出QUERY需要多长时间。

以b-tree索引扫描为例,如下

B-Tree和B+Tree

深入浅出PostgreSQL B-Tree索引结构

b-tree索引扫描开销评估

1. 评估单个索引页的item数
b-tree索引页,除了固定的头和尾部信息,剩下的就是value+ctid。
ctid为6个字节,value则由列的类型决定。
例如int类型的索引,一个索引条目的大小=4+6=10字节,每个条目还需要加上一些条目的head。
一个8K的数据块,除掉头部和尾部,可能能存下约400个条目。

2. 评估索引深度
一个页的索引条目数固定了之后,就可以算出每个深度最多能支持的记录数了。
以上面case为例, 只有root page的索引,只能存下400条。
2级索引则能存下400^2 的记录数。
以此类推。

3. 评估索引扫描的扫描块数
如果是PK查询,索引扫描要扫描的块数=metapage + level + heap page.
例如深入为2的索引,需要扫描4个块。

4. 评估时间
因为索引都是离散的块,离散扫描的时延完全由块设备决定。
例如机械盘的时延约等于8毫秒,扫描4个块就是32毫秒。
SSD的扫描时延相比机械盘则很低。

例子

回到前面的场景, 一张业务表有15个字段,平均行长度为100字节,其中有一个PK字段为INT类型,当数据量达到1万亿时,使用PK查询1条记录需要多久的响应时间?

postgres=# create table tt1(id int primary key, c1 text, c2 text, c3 int, c4 int, c5 timestamp, c6 inet, c7 int4range, c8 point, c9 float8, c10 tsvector, c11 tsquery, c12 line, c13 box, c14 int[], c15 interval);
CREATE TABLE

评估索引层级

postgres=# select 400^5 > 1000000000000;
 ?column?
----------
 t
(1 row)

postgres=# select 400^4 > 1000000000000;
 ?column?
----------
 f
(1 row)

8KB 的块,5级索引即可满足 1万亿 的记录数。
即使为机械盘,这类扫描的成本也只需要56毫秒。

如果考虑分区表,假设每1000万一个分区,则只需要3级索引,40毫秒可以满足需求。

postgres=# select 400^2 > 10000000;
 ?column?
----------
 f
(1 row)

postgres=# select 400^3 > 10000000;
 ?column?
----------
 t
(1 row)

其他的QUERY,同样也需要从执行计划入手,评估出需要扫描的记录数,以及需要扫描多少数据块。 从而推算出需要的时间。

可能还有人会问,为什么评估出来的QUERY只需要几十毫秒,但是在生产中需要秒级返回?

因为前面的评估是不考虑并发的,考虑并发的情况下,就会遇到资源争抢的问题,例如机械盘提供的IOPS有限,遇到争抢,等待的时间也要算上去。 并发达到100时,有些QUERY可能就要等待上秒的时间了。

所以对于活跃数据非常庞大,又需要低延迟响应的场景,还是考虑SSD吧。

补充

对于B+tree, 如innodb引擎,因为数据和索引值是在一棵树里面的,虽然只在最下面一层存储,但是也不可避免的造成一个PAGE存储的条目更加有限,比如一条记录500字节,8K的块最多能存储10几条记录,这样的话1万亿需要7级索引。 前5级存储400每页,最后一级存储18每页。
访问7个数据块,定位到一条记录。

祝大家玩得开心,欢迎随时来 阿里云促膝长谈业务需求 ,恭候光临

阿里云的小伙伴们加油,努力 做好内核与服务,打造最贴地气的云数据库

时间: 2024-09-17 04:48:24

如何评估QUERY的响应时间?的相关文章

SolrQuery性能压测参考

大致有下面几类特征应用 一类 key-value,数据库join搬到倒排中而已, 代表应用 很大部分应用场景 一类 区间查询为主 代表应用 **** 一类 纯文本查,不存储,典型只查索引返回DB的索引id信息,代表应用 **** 一类 各种查询涵盖,facet.区间.group较多 典型代表 *** 如果应用场景相类似,已在线应用的性能或者历史压测数据具有一定的参考价值. 如果应用场景不类似,特别是有某个极端需求或者极端场景特征的话,通常需要具体测试和针对性优化. 搜索压测 性能压测需要关注:数

建站心得:网站规划书的写作规范

规范|规划|心得 一个网站的成功与否与建站前的网站规划有着极为重要的关系.在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行. 网站规划是指在网站建设前对市场进行分析.确定网站的目的和功能,并根据需要对网站建设中的技术.内容.费用.测试.维护等做出规划.网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用. 网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规

网站快速成功的九个步骤

一个网站的成功与否与建站前的网站策划有着极为重要的关系.在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的策划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行. 网站策划是指在网站建设前对市场进行分析.确定网站的目的和功能,并根据需要对网站建设中的技术.内容.费用.测试.维护等做出策划.网站策划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用. 网站策划包含的内容如下: 一.建设网站前的市场分析(企业自行处理) 1.

怎样做网站规划

规划 一个网站的成功与否与建站前的网站规划有着极为重要的关系.在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行. 网站规划是指在网站建设前对市场进行分析.确定网站的目的和功能,并根据需要对网站建设中的技术.内容.费用.测试.维护等做出规划.网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用. 网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规划书的写作要

网站的基本规划书

规划 一个网站的成功与否与建站前的网站规划有着极为重要的关系.在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行.  网站规划是指在网站建设前对市场进行分析.确定网站的目的和功能,并根据需要对网站建设中的技术.内容.费用.测试.维护等做出规划.网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用. 网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规划书的写作

网站规划书的写作规范

规范|规划 一个网站的成功与否与建站前的网站规划有着极为重要的关系.在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行. 网站规划是指在网站建设前对市场进行分析.确定网站的目的和功能,并根据需要对网站建设中的技术.内容.费用.测试.维护等做出规划.网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用. 网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规划书的

建站前应该进行的网站建设规划

站长在建站前应该尽可能的规划好网站的主题内容及发展方向,下面列出几点规划要点: 一.建站前的市场分析 1.相关行业的市场是怎样的,市场有什么样的特点,是否能够在互联网上开展公司业务. 2.市场主要竞争者分析,竞争对手上网情况及其网站规划.功能作用. 3.自身条件分析.市场优势,可以利用网站提升哪些竞争力,建设网站的能力(费用.技术.人力等). 二.建站目的及功能定位 1.为什么要建立网站? 2.根据网站功能,确定网站应达到的目的作用. 三.网站技术解决方案 根据网站的功能确定网站技术解决方案.

SQL Server 2012研发团队背后的故事

本文讲的是SQL Server 2012研发团队背后的故事,在切入正题之前,就让浸泡在数据海洋里的我们,看几个并不陌生的场景吧. 场景一:痛苦的升级 三十六岁的吴桐坡是一个电商网站的首席技术官,最近有点头疼:业务旺季就在眼前,现在的内存.盘阵.操作系统和应用平台已经有点扛不住.老板却已发话,今年要基于用户消费行为的统计与分析,上线更多的新品类.唉,又要和部门里的兄弟们熬夜了.好在之前做了不少准备工作,对这次升级的成本和问题心里大概有底."但过去几年,哪次硬件变更和软件升级没出过岔子?我怎么敢跟老

全球私有云的中国挑战者来了

"第一"."唯一"这些形容词对于华为来说可能是司空见惯了.不过,在近日公布的Forrester全球私有云软件套件wave报告中,华为首次入围并被评为Strong Performer,其意义和重要性又不同于以往. 2015年2月,华为就曾以Strong Performers的身份入围Forrester Private Cloud Wave China,市场表现排名第一.不过,那还只是在中国市场上.而这次华为入围的是Forrester全球私有云软件套件wave报告,并且