2.1 理解代价模型

创建测试数据:

CREATE TABLE t_test (
    id serial,
    name text
);


INSERT INTO t_test (
    name
)
SELECT
    'hans'
FROM
    generate_series(1, 2000000);


INSERT INTO t_test (
    name
)
SELECT
    'paul'
FROM
    generate_series(1, 2000000);
SELECT
    name, 
    count(*) 
FROM
   t_test
GROUP BY
    name;
    
 name |  count
------+---------
 paul | 2000000
 hans | 2000000
(2 rows)


postgres=# \timing
Timing is on.


SELECT
    * 
FROM
    t_test
WHERE
    id = 432332;
    
   id   | name
--------+------
 432332 | hans
(1 row)

Time: 951.449 ms

使用EXPLAIN

读取4百万行用了超过900ms时间。为了找出什么地方不对,PostgreSQL提供了EXPLAIN命令:

postgres=# \h EXPLAIN

Command:     EXPLAIN
Description: show the execution plan of a statement
Syntax:
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

where option can be one of:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }

下面这个列表中看到的就是执行计划:

EXPLAIN
SELECT
    *
FROM 
    t_test
WHERE
    id = 432332;
            
                               QUERY PLAN
-------------------------------------------------------------------------
 Gather  (cost=1000.00..43455.43 rows=1 width=9)
   Workers Planned: 2
   ->  Parallel Seq Scan on t_test  (cost=0.00..42455.33 rows=1 width=9)
         Filter: (id = 432332)
(4 rows)

在PostgreSQL中,一个SQL语句将被分成4个阶段执行。下列组件会参与其中:

  • 解析器检查语法错误已经明显的问题;
  • 重写系统负责规则(视图等);
  • 优化器解决如何以最有效的方法执行一个查询并且制定出一个计划;
  • 优化器提供的计划被执行器用来创建最终结果。

EXPLAIN的目的是看看计划器给出什么样的东西来高效地运行查询。在这个例子中,PostgreSQL将使用一个并行顺序扫描,这意味着两个工作者将合作来处理过滤条件。得到的局部结果接下来通过收集节点联合起来。

并行工作者的数量由表的尺寸决定。并行并非必不可少,可以设置为0:

SET
    max_parallel_workers_per_gather
TO
    0;

深究代价模型

如果只有一个CPU被使用,执行计划看起来会是这样:

EXPLAIN
SELECT
    *
FROM 
    t_test
WHERE
    id = 432332;
    
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on t_test  (cost=0.00..71622.00 rows=1 width=9)
   Filter: (id = 43312)
(2 rows)

PostgreSQL将顺序读取整个表并且应用过滤条件。该操作将花费71622惩罚点。惩罚点是一种抽象概念,如果一个查询可以被执行器以多种方式执行,PostgreSQL将选取承诺最低代价的执行计划。

计算原理如下:

SELECT
    pg_relation_size('t_test') / 8192.0;
    
      ?column?
--------------------
 21622.000000000000
(1 row)

这个关系由21622个块构成。根据代价模型,PostgreSQL将会为它必须顺序读取的每个块加上代价1。

影响这个过程的配置参数是:

SHOW seq_page_cost;

 seq_page_cost
---------------
 1
(1 row)

不过,从磁盘读取一大堆块并非我们要做的所有事情。还需要通过CPU应用过滤条件并且发送那些行。有两个参数负责相应的代价:

SHOW cpu_tuple_cost;    -- 发送一行的代价

 cpu_tuple_cost
----------------
 0.01
(1 row)


SHOW cpu_operator_cost;    -- 对一行应用过滤条件的代价

 cpu_operator_cost
-------------------
 0.0025
(1 row)

计算如下:

SELECT
    21622*1 + 4000000*0.01 + 4000000*0.0025;

  ?column?
------------
 71622.0000
(1 row)

再举个例子:

EXPLAIN
SELECT
    *
FROM
    t_test;
    
                           QUERY PLAN
----------------------------------------------------------------
 Seq Scan on t_test  (cost=0.00..61622.00 rows=4000000 width=9)
(1 row)


SELECT
    21622*1 + 4000000*0.01;
    
 ?column?
----------
 61622.00
(1 row)

PostgreSQL还有一些用于索引相关操作的特殊参数:

  • random_page_cost = 4:如果PostgreSQL使用一个索引,通常会涉及很多随机IO。在机械盘上,随机读比顺序读重要得多,因此PostgreSQL也将相应地解释它们。在SSD上,随机读和顺序读之间的差异已经不再存在,因此可以设置random_page_cost = 1。
  • cpu_index_tuple_cost = 0.005:如果使用了索引,PostgreSQL还将考虑一些索引的CPU代价。

如果用户使用并行查询,还有更多代价参数:

  • parallel_tuple_cost = 0.1:这个参数定义了从一个并行工作者进程向另一个进程传输一个元组的代价。它基本上用于解释在并行架构内部移动元组的开销。
  • parallel_setup_cost = 1000.0:这个参数调整发动一个工作者进程的代价。
  • min_parallel_relation_size = 8MB:这个参数定义了考虑使用并行查询的表的最小尺寸。一个表长得越大,PostgreSQL就将考虑使用更多的CPU。表的尺寸必须成为之前3倍才会多出一个工作者进程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模型是一种新兴的计算模型,它采用了分布式的方式对计算任务进行处理和管理。而其中的一项重要内容就是lin conformance 2.1(符合性测试2.1)。它是指云模型在处理和管理计算任务时需要符合一系列规范和标准。这些规范和标准主要包括性能、可靠性、可扩展性、安全性等方面。 首先,lin conformance 2.1要求云模型具备高性能。这意味着它需要能够快速、准确地处理大量的计算任务。同时,它还要能够在负载高峰期保持良好的性能表现,确保用户能够及时地获得计算结果。 其次,lin conformance 2.1要求云模型具备高可靠性。这意味着云模型在处理计算任务时不能因为硬件或软件故障而导致数据丢失或计算结果错误。为了保证这一点,云模型需要具备可靠的备份和恢复机制,以及有效的错误检测和修复技术。 再次,lin conformance 2.1要求云模型具备良好的可扩展性。这意味着云模型在处理大规模计算任务时,能够根据需求动态地调整资源分配和任务调度,以保持高效的运行状态。同时,云模型还应该支持多用户和多租户,能够分配和管理不同用户之间的计算资源。 最后,lin conformance 2.1要求云模型具备高安全性。这意味着云模型在处理计算任务时需要保护用户的隐私和数据安全。为了达到这一目标,云模型需要提供有效的身份认证和访问控制机制,并采取加密和防护措施来防止未经授权的访问和数据泄露。 总而言之,lin conformance 2.1要求云模型在性能、可靠性、可扩展性和安全性等方面符合一系列规范和标准,以提供高效、可靠、安全的计算服务。只有符合这些规范和标准,云模型才能更好地满足用户的需求,并推动云计算技术的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值