PostgreSQL 元组统计与 pgstattuple 优化

在这里插入图片描述

第1章 简介
1.1 参考文档
https://www.percona.com/blog/postgresql-tuple-level-statistics-with-pgstattuple/
1.2 关于pgstattuble
由于Postgres表膨胀会降低数据库性能,因此我们可以通过消除表膨胀来提高其性能。我们可以使用pgstattuple扩展来识别膨胀的表。
这个扩展提供了几个函数来获取元级统计信息。因为pgstattuple函数产生大量的页面级信息,所以默认情况下对它们的访问是有限的。默认情况下,只有pg_stat_scan_tables角色有能力执行pgstattuple函数。
使用pgstattuple函数,我们可以列出死元组百分比高的表,并运行手动VACUUM来回收死元组占用的空间。
第2章 pgstattuble 插件安装 & 测试
2.1 PG15 & pg_tde编译
2.1.1 操作系统信息
我的操作系统是CentOS 8.5,其内核信息如下
[root@pg-server01 ~]# uname -a
Linux pg-server01 4.18.0-348.el8.x86_64 #1 SMP Tue Oct 19 15:14:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@pg-server01 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111

2.1.2 配置阿里云 yum 源

参考如下链接 # 操作步骤略

https://www.cnblogs.com/hunttown/p/16287988.html

2.1.3 安装相关依赖
yum -y install gcc readline readline-devel zlib-devel openssl-devel libicu-devel make json-c-devel git wget

2.1.4 下载PG15 源码&编译
mkdir -p /data/software/pg/;
cd /data/software/pg/;
wget https://ftp.postgresql.org/pub/source/v15.4/postgresql-15.4.tar.gz

tar -xvf postgresql-15.4.tar.gz;
cd ./postgresql-15.4;
./configure
–prefix=/opt/pgsql
–with-openssl

make && make install

2.1.5 编译 pgstattuble 插件
cd /data/software/pg/postgresql-15.4/;
cd ./contrib/pgstattuple;
make && make install

2.1.6 编译 btree_gin 插件
cd /data/software/pg/postgresql-15.4/;
cd ./contrib/btree_gin;
make && make install

2.2 安装配置PG
2.2.1 添加 postgres用户并授权
useradd postgres

chown -R postgres:postgres /home/postgres;
chown -R postgres:postgres /opt/pgsql;

2.2.2 配置环境变量
vi /etc/profile # 添加如下内容

pg env

export PGHOME=/opt/pgsql
export PATH= P A T H : PATH: PATH:PGHOME/bin

2.2.3 初始化数据库

1. 创建相关目录,并授权

mkdir -p /data/pgdata/;
chown postgres:postgres /data/pgdata/;

2. 切换到 postgres 用户

su - postgres

3. 初始化数据库

initdb -D /data/pgdata/ -U postgres --encoding=UTF8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8

4. 启动数据库

pg_ctl -D /data/pgdata/ start

2.3 测试 pgstattuble 插件

2.3.1 开启 pgstattuble 插件
su - postgres
psql
select * from pg_available_extensions where name=‘pgstattuple’;
create extension pgstattuple;
select * from pg_available_extensions where name=‘pgstattuple’;

我的操作输出类似如下:

[root@pg-server01 opt]# su - postgres
[postgres@pg-server01 ~]$ psql
psql (15.4)
Type “help” for help.

postgres=# select * from pg_available_extensions where name=‘pgstattuple’;
name | default_version | installed_version | comment
-------------±----------------±------------------±----------------------------
pgstattuple | 1.5 | | show tuple-level statistics
(1 row)

postgres=# create extension pgstattuple;
CREATE EXTENSION
postgres=# select * from pg_available_extensions where name=‘pgstattuple’;
name | default_version | installed_version | comment
-------------±----------------±------------------±----------------------------
pgstattuple | 1.5 | 1.5 | show tuple-level statistics
(1 row)

postgres=#

注意:默认情况下,只有超级用户可以访问 pgstattuple 函数; 但是,您可以通过将 pg_stat_scan_tables 角色授予非超级用户来授予非超级用户访问权限。

grant pg_stat_scan_tables to ;

2.3.2 pgstattuble测试前准备
接下来,在使用 pgstattuple 函数之前,让我们创建一个表和索引来进行演示。
psql
create table workshop (jobno int);
insert into workshop values (generate_series(1,80000));
create index workshop_index on workshop (jobno);

我的操作输出类似如下:

[postgres@pg-server01 ~]$ psql
psql (15.4)
Type “help” for help.
postgres=# create table workshop (jobno int);
CREATE TABLE
postgres=# insert into workshop values (generate_series(1,80000));
INSERT 0 80000
postgres=# create index workshop_index on workshop (jobno);
CREATE INDEX
postgres=#

2.3.3 pgstattuple 功能
2.3.3.1 pgstattuple(regclass)
这个函数返回一个关系的物理长度,“死亡”元组的百分比,以及其他信息。这可以帮助用户确定是否需要真空。参数是目标关系的名称(可选的模式限定)或OID。例如:

显示 pg_catalog.pg_proc 表 的元组统计信息。

SELECT * FROM pgstattuple(‘pg_catalog.pg_proc’);

显示 workshop 表 的元组统计信息。

SELECT * FROM pgstattuple(‘workshop’);

注意: Pgstattuple 只获得关系上的读锁。因此,pgstattuple 输出并不表示瞬时快照。并发更新将改变 pgstattuple 的输出。

我的操作输出类似如下:

postgres=# \x
Expanded display is on.
postgres=# SELECT * FROM pgstattuple(‘pg_catalog.pg_proc’);
-[ RECORD 1 ]------±------
table_len | 786432
tuple_count | 3253
tuple_len | 731586
tuple_percent | 93.03
dead_tuple_count | 12
dead_tuple_len | 4790
dead_tuple_percent | 0.61
free_space | 22564
free_percent | 2.87

postgres=# SELECT * FROM pgstattuple(‘workshop’);
-[ RECORD 1 ]------±-------
table_len | 2899968
tuple_count | 80000
tuple_len | 2240000
tuple_percent | 77.24
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 10056
free_percent | 0.35

2.3.3.2 下面是pgstattuple输出列及其说明

| 字段名 | 类型 | 说明 |

| table_len | bigint | 物理关系长度,以字节为单位 |

| tuple_count | bigint | 活动元组的数量 |

| tuple_len | bigint | 活元组的总长度(以字节为单位) |

| tuple_percent | float8 | 活元组的百分比 |

| dead_tuple_count | bigint | 无效(死)元组的数量 |

| dead_tuple_len | bigint | 无效(死)元组的总长度(以字节为单位) |

| dead_tuple_percent | float8 | 无效(死)元组的百分比 |

| free_space | bigint | 总可用空间(以字节为单位) |

| free_percent | float8 | 可用空间百分比 |

2.3.3.3 让我们在删除或更新行时检查元组统计信息

1. 下面是引用的当前元组统计信息。

postgres=# SELECT * FROM pgstattuple(‘workshop’);
-[ RECORD 1 ]------±-------
table_len | 2899968
tuple_count | 80000
tuple_len | 2240000
tuple_percent | 77.24
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 10056
free_percent | 0.35

2. Delete the few ROWS from the table.

DELETE FROM workshop WHERE jobno % 8 = 0;

3. 在下面的输出中,dead_tuple_count 显示 Postgres 将这些行标记为已删除,但没有从表中删除它们,因为删除这些行后表的长度是相同的。

postgres=# SELECT * FROM pgstattuple(‘workshop’);
-[ RECORD 1 ]------±-------
table_len | 2899968
tuple_count | 70000
tuple_len | 1960000
tuple_percent | 67.59
dead_tuple_count | 10000
dead_tuple_len | 280000
dead_tuple_percent | 9.66
free_space | 10056
free_percent | 0.35

2.3.3.4 在表上执行VACUUM命令

1. 运行普通VACUUM后,我们看到:

vacuum workshop;
SELECT * FROM pgstattuple(‘workshop’);

2. 在运行VACUUM FULL命令后,我们可以看到 table_len 减少了。显示运行VACUUM FULL后,os级空间被回收。

vacuum full workshop;
SELECT * FROM pgstattuple(‘workshop’);

我的操作输出类似如下:

postgres=# vacuum workshop;
VACUUM
postgres=# SELECT * FROM pgstattuple(‘workshop’);
-[ RECORD 1 ]------±-------
table_len | 2899968
tuple_count | 70000
tuple_len | 1960000
tuple_percent | 67.59
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 330412
free_percent | 11.39

postgres=# vacuum full workshop;
VACUUM
postgres=# SELECT * FROM pgstattuple(‘workshop’);
-[ RECORD 1 ]------±-------
table_len | 2539520
tuple_count | 70000
tuple_len | 1960000
tuple_percent | 77.18
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 10840
free_percent | 0.43

2.3.3.5 pgstattuple 查询检查表膨胀

1. 我们可以使用下面的查询列出死元组百分比高的表。

注意:如果pg16.0 版本的话, 下面查询语句将报错 “ERROR: only heap AM is supported”,是pg16 的一个 bug,参考:https://www.postgresql.org/message-id/202309200826.z3ckjb4g7auj%40alvherre.pgsql

select relname,(pgstattuple(oid)).dead_tuple_percent
from pg_class
where relkind = ‘r’
order by dead_tuple_percent desc limit 10;

我的查询输出类似如下:

postgres=# \x
Expanded display is off.
postgres=#
postgres=# select relname,(pgstattuple(oid)).dead_tuple_percent
postgres-# from pg_class
postgres-# where relkind = ‘r’
postgres-# order by dead_tuple_percent desc limit 10;
relname | dead_tuple_percent
-----------------------±-------------------
pg_init_privs | 2.56
pg_extension | 1.28
pg_class | 0.75
pg_proc | 0.61
pg_depend | 0.47
pg_statistic | 0.36
pg_type | 0.29
pg_attribute | 0.06
pg_user_mapping | 0
pg_statistic_ext_data | 0
(10 rows)

2. 下面的查询将向您详细显示死元组百分比高的表的元组统计信息。

SELECT relname, oid, relowner,
(pgstattuple(oid)).*
FROM pg_class
WHERE relkind = ‘r’ order by dead_tuple_percent desc limit 5;

我的操作输出类似如下:

postgres=# SELECT relname, oid, relowner,
postgres-# (pgstattuple(oid)).*
postgres-# FROM pg_class
postgres-# WHERE relkind = ‘r’ order by dead_tuple_percent desc limit 5;
-[ RECORD 1 ]------±-------------
relname | pg_init_privs
oid | 3394
relowner | 10
table_len | 24576
tuple_count | 222
tuple_len | 17316
tuple_percent | 70.46
dead_tuple_count | 9
dead_tuple_len | 630
dead_tuple_percent | 2.56
free_space | 4568
free_percent | 18.59
-[ RECORD 2 ]------±-------------
relname | pg_extension
oid | 3079
relowner | 10
table_len | 8192
tuple_count | 2
tuple_len | 210
tuple_percent | 2.56
dead_tuple_count | 1
dead_tuple_len | 105
dead_tuple_percent | 1.28
free_space | 7816
free_percent | 95.41
-[ RECORD 3 ]------±-------------
relname | pg_class
oid | 1259
relowner | 10
table_len | 114688
tuple_count | 412
tuple_len | 79912
tuple_percent | 69.68
dead_tuple_count | 5
dead_tuple_len | 860
dead_tuple_percent | 0.75
free_space | 28656
free_percent | 24.99
-[ RECORD 4 ]------±-------------
relname | pg_proc
oid | 1255
relowner | 10
table_len | 786432
tuple_count | 3253
tuple_len | 731586
tuple_percent | 93.03
dead_tuple_count | 12
dead_tuple_len | 4790
dead_tuple_percent | 0.61
free_space | 22564
free_percent | 2.87
-[ RECORD 5 ]------±-------------
relname | pg_depend
oid | 2608
relowner | 10
table_len | 114688
tuple_count | 1854
tuple_len | 90846
tuple_percent | 79.21
dead_tuple_count | 11
dead_tuple_len | 539
dead_tuple_percent | 0.47
free_space | 2288
free_percent | 1.99

2.3.4 pgstatindex(regclass)

2.3.4.1 这个函数返回一条显示b树索引信息的记录

1. 例如

SELECT * FROM pgstatindex (‘workshop_index’);

我的查询输出类似如下:

postgres=# SELECT * FROM pgstatindex (‘workshop_index’);
-[ RECORD 1 ]------±-------
version | 4
tree_level | 1
index_size | 1589248
root_block_no | 3
internal_pages | 1
leaf_pages | 192
empty_pages | 0
deleted_pages | 0
avg_leaf_density | 89.74
leaf_fragmentation | 0

2.3.4.2 输出列及其描述

| 字段名 | 类型 | 说明 |

| version | integer | b树版本号 |

| tree_level | integer | 根页面的树级别 |

| index_size | bigint | 总索引大小(以字节为单位) |

| root_block_no | bigint | 根页面的位置(如果没有则为零) |

| internal_pages | bigint | “内部”(上层)页面的数量 |

| leaf_pages | bigint | 叶子结点的个数 |

| empty_pages | bigint | 空页的个数 |

| deleted_pages | bigint | 删除页面数 |

2.3.5 pgstatginindex(regclass)

2.3.5.1 这个函数返回一条显示GIN索引信息的记录
GIN索引参考:https://pganalyze.com/blog/gin-index

1. 例1

1.1 前期 建表、索引等相关 SQL

– DROP TABLE IF EXISTS test;
CREATE TABLE test (
id bigserial PRIMARY KEY,
data jsonb
);
INSERT INTO test(data) VALUES (‘{“field”: “value1”}’);
INSERT INTO test(data) VALUES (‘{“field”: “value2”}’);
INSERT INTO test(data) VALUES (‘{“other_field”: “value42”}’);
– CREATE INDEX ON test USING gin(data jsonb_path_ops);
CREATE INDEX test_data_gin_idx ON test USING gin(data jsonb_path_ops);
EXPLAIN SELECT * FROM test WHERE data @> ‘{“field”: “value1”}’;

1.2 测量GIN挂起列表开销和大小

1.2.1 首先,我们可以将pgstatginindex函数与类似psql的\watch命令一起使用,以密切关注特定索引

SELECT * FROM pgstatginindex(‘test_data_gin_idx’);

我的操作输出类似如下:

postgres=# SELECT * FROM pgstatginindex(‘test_data_gin_idx’);
version | pending_pages | pending_tuples
---------±--------------±---------------
2 | 0 | 0
(1 row)

注意:如果在创建索引的时候不指定”索引名称”,类似语句 “CREATE INDEX ON test USING gin(data jsonb_path_ops);”,需要先执行类似如下查询,查到其信息(包括索引名称),再根据其查询到的索引名称,将其传参到上面查询(当然:其实如果不指定索引名称的话,其索引命名也是有规律的)。

select *
from pg_indexes
where tablename = ‘test’;

1.2.2 其次,如果您运行自己的数据库服务器,您可以使用 “perf”动态跟踪点 来测量对 Postgres 中 ginInsertCleanup 函数的调用

dnf install perf
sudo perf probe -x /opt/pgsql/bin/postgres ginInsertCleanup
sudo perf stat -a -e probe_postgres:ginInsertCleanup – sleep 60

2. 例2

2.1 前期 建表、索引等相关 SQL

– DROP TABLE IF EXISTS records;
CREATE TABLE records (
id bigserial PRIMARY KEY,
customer_id int4,
data jsonb
);

CREATE EXTENSION btree_gin;
CREATE INDEX ON records USING gin (data, customer_id);

EXPLAIN SELECT * FROM records WHERE customer_id = 123 AND data @> ‘{ “location”: “New York” }’;
EXPLAIN SELECT * FROM records WHERE customer_id = 123;

select *
from pg_indexes
where tablename = ‘records’;

注意:如下查询中的 “records_data_customer_id_idx” 就是 上面查询结果的 indexname 字段值

SELECT * FROM pgstatginindex(‘records_data_customer_id_idx’);

3. pganalyze索引顾问中的GIN索引支持

注意:在 https://pganalyze.com/index-advisor 页面测试

现在,我们已经向pganalyze index Advisor添加了对GIN和GIST索引建议的初始支持

下面是一个为现有的tsvector列推荐GIN索引的示例

CREATE TABLE post(
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT NOT NULL,
author_id INT NOT NULL,
language text NOT NULL DEFAULT(‘english’),
document tsvector
);

SELECT id, title FROM post
WHERE post.document @@ to_tsquery(‘english’, ‘Endangered & Species’)
ORDER BY ts_rank(post.document, to_tsquery(‘english’, ‘Endangered & Species’)) DESC

2.3.6 pgstathashindex(regclass)

2.3.6.1 参考文档
https://postgrespro.com/blog/pgsql/4161321
https://postgrespro.com/docs/postgrespro/15/demodb-bookings-installation

2.3.6.2 测试

1. 例如

1.1 前期准备

1.1.1 从 https://postgrespro.com/docs/postgrespro/15/demodb-bookings-installation 下载 demo-small-en.zip 文件到 /data/software/pg/demo-data/ 并解压(解压后生成 demo-small-en-20170815.sql 文件

1.1.2 postgres 用户下执行如下命令

cd /data/software/pg/demo-data/;
psql -f demo-small-en-20170815.sql

1.2 为 demo 数据库的 flights 表的 flight_no 字段 创建 hash 索引 & 相关测试

1.2.1 创建 hash 索引

psql
\c demo
create index on flights using hash(flight_no);

1.2.2 创建 pgstattuple 扩展

因为切换到 demo 数据库了,所以需要重新创建 pgstattuple 扩展

create extension pgstattuple;
select * from pg_available_extensions where name=‘pgstattuple’;

1.2.3 查询刚才创建的索引

select *
from pg_indexes
where tablename = ‘flights’;

1.2.4 查看相关 sql 执行计划 & 查看相关索引信息

explain (costs off) select * from flights where flight_no = ‘PG0001’;
select * from pgstathashindex(‘flights_flight_no_idx’);

最后:我的查询输出类似如下

demo=# explain (costs off) select * from flights where flight_no = ‘PG0001’;
QUERY PLAN

Bitmap Heap Scan on flights
Recheck Cond: (flight_no = ‘PG0001’::bpchar)
-> Bitmap Index Scan on flights_flight_no_idx
Index Cond: (flight_no = ‘PG0001’::bpchar)
(4 rows)

demo=# select * from pgstathashindex(‘flights_flight_no_idx’);
version | bucket_pages | overflow_pages | bitmap_pages | unused_pages | live_items | dead_items | free_percent
---------±-------------±---------------±-------------±-------------±-----------±-----------±------------------
4 | 128 | 13 | 1 | 0 | 33121 | 0 | 42.36979656038809
(1 row)

#PG数据库工程师的摇篮#PostgreSQL考试#PostgreSQL培训
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

网络和信息系统指令 ( NIS2 ) 及其全球影响

网络和信息系统指令 ( NIS2 ) 将于 2024 年 10 月生效,旨在提高欧盟 (EU) 的网络弹性。 不过,其影响可能会更广泛,带来更严格的流程和控制,并重新定义我们向被视为国家关键的组织提供服务的方式。 该强制性指令将具有效力&#x…

锂电涂布机设备健康管理:降低运维成本的关键

随着锂电池行业的快速发展,锂电涂布机设备作为关键生产工艺装备,扮演着至关重要的角色。然而,涂布机设备的故障和维护成本对于企业来说是一个不可忽视的挑战。本文将介绍做好锂电涂布机设备的健康管理,降低运维成本的关键措施。 锂…

初刷leetcode题目(11)——数据结构与算法

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

Elasticsearch初识--CentOS7安装ES及Kibana

文章目录 一.前言二.介绍1.Elasticsearch2.Kibana 三.ES安装1.下载安装包2.解压、配置2.1 解压2.2 配置 3.启动3.1增加用户3.2启动 4.解决资源分配太少问题5.启动成功 四.Kibana安装1.下载安装包2.解压、配置2.1 解压2.2 配置2.2 …

太快了!文生图片只需1秒,开源SDXL Turbo来啦!

11月29日,著名开源生成式AI平台Stability.ai在官网发布了,开源文生图模型SDXL Turbo。 根据使用体验,SDXL Turbo的生成图像效率非常快,可以做到实时响应(可能小于1秒)。 在你输入完最后一个文本后&#x…

【优选算法系列】【专题十四优先级队列】第一节.(1046. 最后一块石头的重量和703. 数据流中的第 K 大元素)

文章目录 前言一、最后一块石头的重量 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、数据流中的第 K 大元素 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2…

java第20章节

一.线程简介 二.创建线程 1.继承Thread类 Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thread(String threadName):创建一个名称为threadName的线程对象。 继承Thread类创建一个新的线程的语法如下: public c…

AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案

随着科技的不断进步,基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术,实现对视频数据的智能分析和处理,从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…

建立健全涉密测绘外业安全保密管理制度,落实监管人员和保密责任,外业所用涉密计算机纳入涉密单机进行管理

建立健全涉密测绘外业安全保密管理制度,落实监管人员和保密责任,外业所用涉密计算机纳入涉密单机进行管理 1.涉密测绘外业安全保密管理制度 2.外业人员及设备清单(包括:外业从业人员名单、工作岗位,外业设备名称、密…

Opencv | 直方图均衡化

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() cv2.calcHist(images,channels,mask,histSize,ranges) - …

Gitee-PicGo-Typora

Gitee-PicGo-Typora 问题引出 问题1:根据相关法律法规和政策,您的部分文件因存在敏感信息而无法显示 就在昨晚, 我在记笔记的时候,发现之前配置的七牛云图床出了问题: 1、根据相关法律法规和政策,您的部…

JAVA进阶之路JVM-3:JVM内存模型,运行时数据区域划分,程序计数器,虚拟机栈,本地方法栈,堆,元空间,字符串常量池

JVM内存模型 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C 程序开发程序员这样为每一个操作去写对应的 delete / free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序把内new存控制权利交给JVM虚拟机。一旦…

JS动态转盘可自由设置个数与概率

让我为大家介绍一下转盘的实现过程与原理&#xff0c;介绍都放在下面代码块中&#xff0c;一步一步的教会你。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style type&quo…

【理解ARM架构】异常处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 ⚡ARM系统中异常与中断处理流程&#x1f362;向量表&#x1f362;保存现场&#x1f362;恢…

对一个预算有限的创业者来说,应该选择哪些形式的办公场地

对于一个预算有限的创业者来说&#xff0c;选择合适的办公场地是一个重要的决策。不同的办公场地形式有各自的优缺点&#xff0c;需要根据创业者的具体情况和需求来权衡。 一般来说&#xff0c;有以下几种常见的办公场地形式&#xff1a; - 家庭办公&#xff1a;这是最节省成本…

觉得可视化地图太难做?那你是没用过它!

后台一直有粉丝私信老李&#xff0c;问到现在各大企业对数据可视化越来越看重&#xff0c;但是感觉那些高大上的图表做起来一定很复杂甚至可能还需要一些编程基础&#xff0c;希望老李可以推荐一些简单好上手的数据可视化工具。   作为一名数据分析爱好者&#xff0c;我也尝试…

STM32之定时器--超声波测距

1、模块介绍 型号&#xff1a;HC-SR04 超声波测距模块是用来测量距离的一种产品&#xff0c;通过发送和收超声波&#xff0c;利用时间差和声音传播速度&#xff0c; 计算出模块到前方障碍物的距离。 2、超声波模块的使用方法 怎么让它发送波 Trig &#xff0c;给Trig端口至…

面试篇之微服务(一)

目录 概览 1.什么是微服务&#xff1f; 2.微服务带来了哪些挑战&#xff1f; 3.现在有哪些流行的微服务解决方案&#xff1f; 这三种方案有什么区别吗&#xff1f; 4.说下微服务有哪些组件&#xff1f; 注册中心 5.注册中心是用来干什么的&#xff1f; 6.SpringCloud可…

损失函数总结(十六):NRMSELoss、RRMSELoss

损失函数总结&#xff08;十六&#xff09;&#xff1a;MSLELoss、RMSLELoss 1 引言2 损失函数2.1 NRMSELoss2.2 RRMSELoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNLLLoss、Ga…

亚马逊云科技 re:Invent 2023:引领科技前沿,探索未来云计算之窗

文章目录 一、前言二、什么是亚马逊云科技 re:Invent&#xff1f;三、亚马逊云科技 re:Invent 2023 将于何时何地举行四、亚马逊云科技 re:Invent 2023 有什么内容&#xff1f;4.1 亚马逊云科技 re:Invent 2023 主题演讲4.2 亚马逊云科技行业专家探实战 五、更多亚马逊云科技活…