我在Oracle Linux Server 6.3版上使用PostgreSQL 9.2.
根据存储布局文档,页面布局包含:
我测试它以制作一些公式来估计预期的表格大小......(TOAST概念可能会被忽略.)
postgres=# \d t1;
Table "public.t1"
Column ',' Type ',' Modifiers
---------------+------------------------+------------------------------
code |character varying(8) |not null
name |character varying(100) |not null
act_yn |character(1) |not null default 'N'::bpchar
desc |character varying(100) |not null
org_code1 |character varying(3) |
org_cole2 |character varying(10) |
postgres=# insert into t1 values(
'11111111', -- 8
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100
'Y',
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100
'111',
'1111111111');
postgres=# select * from pgstattuple('t1');
table_len | tuple_count …Run Code Online (Sandbox Code Playgroud) 我计划从 MySQL 迁移到 PostgreSQL,因为我想使用 TimescaleDB。
一切看起来都很好,直到我检查了 PostgreSQL (v11.2) 与 MySQL (v5.6) 使用的存储大小相比。对于完全相同的行数 (1,440,000) 和内容:
MySQL 和 PostgreSQL 的数字就像 for like(即包括索引和其他约束),PostgreSQL + TimescaleDB 有向表添加时间戳的开销。有关的表如下所示:
create table cell(
cell_id serial not null
,ts timestamp not null
,parent_id int references parent( parent_id )
,instance_id smallint
,v float
,a float
,t float
,s1 float
,s2 float
,s3 float
,s4 float
,s5 float
,primary key( cell_id )
);
create index ix_cell_pid on cell( parent_id );
create index …Run Code Online (Sandbox Code Playgroud) 这个 Postgres 数据库拥有各种大小的表,最多可达 1000 万行。几乎所有的都有一个 BIGINT 主键,从 1 开始计数。
由于 BIGINT 是 64 位,但 1000 万行完全在 INT 的 20 亿最大值之内,因此是否值得将这些 BIGINT 列转换为 INT(32 位)和 SMALLINT(16 位)以加速某些重型 SQL?更紧凑地存储索引/表应该会给我们带来更高的缓存命中率。如果有的话,我能期望多少加速?不使用 BIGINT 有什么缺点吗?(假设达到 INT/SMALLINT 的最大值永远不会成为问题)
我被要求将大量数据复制到 Postgres 的新表中。数据包含装配组件列表,在下面的表定义中进行了简化:
CREATE TABLE IF NOT EXISTS assembly_item (
id uuid NOT NULL DEFAULT NULL,
assembly_id. uuid. NOT NULL DEFAULT NULL,
done_dts timestamp NOT NULL DEFAULT 'epoch',
CONSTRAINT assembly_item_pk
PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
原来有几十个属性,现在有几亿行。这些记录分布在多个安装中,并且不存储在本地 Postgres 中。据猜测,该表上的插入量会快速增加,一年内将增长到 1B 行。日期很少更新,也从不删除。(它可能会及时发生,但不会经常发生。)相同的情况永远不会id用不同的值重复。因此,在分区级别上唯一是安全的。这里的目标是将这些数据卸载到 Postgres 上,并仅将最近的数据保留在本地服务器的缓存中。assembly_idid
这看起来像是分区的自然候选者,我正在寻找一些有关合理策略的指导。您可以从简化的结构中看到,我们有一个唯一的 row id、一个parentassembly_id和一个时间戳。我查看了原始数据库中的现有查询,主要搜索字段是assembly_id父记录标识符。assembly和之间的基数assembly_item约为 1:200。
为了使分区最有用,似乎需要根据一个值来分割数据,该值使查询规划器能够智能地修剪分区。我已经想到了一些想法,但还没有 200M 行来再次测试。与此同时,我正在考虑的是:
RANGE使用或LIST按YYYY-MM的进行按月分区done_dts。按日期范围重写所有查询。
HASH根据 的前两个字符进行分区assembly_id::text,得到 256 个大小相当相等的分区。我认为这可以让我们搜索assembly_id并删除许多不匹配的分区,但当我设置它时,它看起来很奇怪。 …
如果我使用TEXT数据类型在数据库中存储ID号,是否有任何不良影响?我做的事情如下:
CREATE TABLE GenData ( EmpName TEXT NOT NULL, ID TEXT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)
实际上,如果我想存储日期值,我通常使用TEXT数据类型.如果这是一种错误的方式,它的缺点是什么?
我在用PostgreSQL.
是的,再次填充因子.我花了很多时间阅读,我无法确定每个案例哪个是更好的填充因子.问题是我不明白何时以及如何进行碎片化.我正在将数据库从MS SQL Server迁移到PostgreSQL 9.2.
情况1)连续(连续)PK中10-50次插入/分钟,每小时20-50次读数.
CREATE TABLE dev_transactions
(
transaction_id serial NOT NULL,
transaction_type smallint NOT NULL,
moment timestamp without time zone NOT NULL,
gateway integer NOT NULL,
device integer NOT NULL,
controler smallint NOT NULL,
token integer,
et_mode character(1),
status smallint NOT NULL,
CONSTRAINT pk_dev_transactions PRIMARY KEY (transaction_id)
)
WITH (
OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)
情况2)PK顺序的类似结构索引将以每个2个月~50,000个寄存器的块(一次)写入,读数为10-50 /分钟.
50%的填充因子意味着在每个插入中将生成一个新页面并将50%的现有记录传输到新的生成页面?
50%的填充因子意味着在创建新页面时,复制的记录将被保留以避免插入之间?
只有在没有空间分配记录时才会生成新页面?
你可以看到我很困惑; 我会很感激它的一些帮助 - 也许是一个关于PostgreSQL和索引填充因子的好链接.
我浏览了一些其他帖子并设法使我的查询运行得更快。但是,我对如何进一步优化此查询感到茫然。我将在一个网站上使用它,它会在页面加载时执行查询,但是 5.5 秒对于等待应该更简单的东西来说太长了。最大的表大约有 4,000,000 行,其他的每行大约有 400,000。
表结构
比赛
id BIGINT PRIMARY KEY,
region TEXT,
matchType TEXT,
matchVersion TEXT
Run Code Online (Sandbox Code Playgroud)
团队
matchid BIGINT REFERENCES match(id),
id INTEGER,
PRIMARY KEY(matchid, id),
winner TEXT
Run Code Online (Sandbox Code Playgroud)
冠军
id INTEGER PRIMARY KEY,
version TEXT,
name TEXT
Run Code Online (Sandbox Code Playgroud)
物品
id INTEGER PRIMARY KEY,
name TEXT
Run Code Online (Sandbox Code Playgroud)
参与者
PRIMARY KEY(matchid, id),
id INTEGER NOT NULL,
matchid BIGINT REFERENCES match(id),
championid INTEGER REFERENCES champion(id),
teamid INTEGER,
FOREIGN KEY (matchid, teamid) REFERENCES team(matchid, id),
magicDamageDealtToChampions REAL,
damageDealtToChampions REAL,
item0 TEXT,
item1 TEXT,
item2 …Run Code Online (Sandbox Code Playgroud) postgresql join sql-optimization postgresql-performance postgresql-9.3
我们的数据库大小之一是50gb。其中一张表有149444622条记录。该表的大小为14GB,其索引大小为16GB。该表及其索引的总大小为30GB。我已经在该表上执行了以下步骤。
reindex table table_name;
vacuum full verbose analyze on table_name;
Run Code Online (Sandbox Code Playgroud)
但是表的大小及其索引大小仍然没有减少。请引导我。如何进一步进行。
表的结构如下。
postgresql ×8
sql ×3
database ×2
storage ×2
types ×2
data-storage ×1
join ×1
mysql ×1
partitioning ×1
uuid ×1