我有一个像pg这样的表:
CREATE TABLE t (
a BIGSERIAL NOT NULL, -- 8 b
b SMALLINT, -- 2 b
c SMALLINT, -- 2 b
d REAL, -- 4 b
e REAL, -- 4 b
f REAL, -- 4 b
g INTEGER, -- 4 b
h REAL, -- 4 b
i REAL, -- 4 b
j SMALLINT, -- 2 b
k INTEGER, -- 4 b
l INTEGER, -- 4 b
m REAL, -- 4 b
CONSTRAINT a_pkey PRIMARY KEY (a)
);
Run Code Online (Sandbox Code Playgroud)
以上每行最多可添加50个字节.我的经验是,我需要另外40%到50%的系统开销,甚至没有任何用户创建的索引.所以,每行约75个字节.我将在表中有许多行,可能超过1450亿行,因此该表将推动13-14太字节.我可以使用什么技巧来压缩这个表?我的可能想法如下......
将 …
在Postgres中,CREATE TABLE语句中列的顺序是否会影响性能?考虑以下两种情况:
CREATE TABLE foo (
a TEXT,
B VARCHAR(512),
pkey INTEGER PRIMARY KEY,
bar_fk INTEGER REFERENCES bar(pkey),
C bytea
);
Run Code Online (Sandbox Code Playgroud)
与
CREATE TABLE foo2 (
pkey INTEGER PRIMARY KEY,
bar_fk INTEGER REFERENCES bar(pkey),
B VARCHAR(512),
a TEXT,
C bytea
);
Run Code Online (Sandbox Code Playgroud)
性能foo2会比foo列更好的字节对齐更好吗?当Postgres执行a时CREATE TABLE它是否遵循指定的列顺序,或者它是否按字符对齐或性能的最佳顺序重新组织列?
请考虑以下表格:
CREATE TABLE user_roles(
pkey SERIAL PRIMARY KEY,
bit_id BIGINT NOT NULL,
name VARCHAR(256) NOT NULL,
);
INSERT INTO user_roles (bit_id,name) VALUES (1,'public');
INSERT INTO user_roles (bit_id,name) VALUES (2,'restricted');
INSERT INTO user_roles (bit_id,name) VALUES (4,'confidential');
INSERT INTO user_roles (bit_id,name) VALUES (8,'secret');
CREATE TABLE news(
pkey SERIAL PRIMARY KEY,
title VARCHAR(256),
company_fk INTEGER REFERENCES compaines(pkey), -- updated since asking the question
body VARCHAR(512),
read_roles BIGINT -- bit flag
);
Run Code Online (Sandbox Code Playgroud)
read_roles是一个位标志,指定可以读取新闻项的某些角色组合.因此,如果我插入一个可以通过限制和机密读取的新闻项目,我会将read_roles设置为值为2 | 46或当我想要返回特定用户可以看到的新闻帖子时,我可以使用类似的查询.
select * from news WHERE company_fk=2 AND …Run Code Online (Sandbox Code Playgroud) 我正在运行一个非常大的查询,在表中插入了很多行,在一些较小的查询中划分了近800万行,但在某些时刻出现了错误:"我收到错误"无法写入块...临时文件没有空间留在设备上......"使用postgresql".我不知道是否需要在每次查询后删除临时文件以及如何执行此操作,或者是否与其他问题相关.
谢谢
采取以下两个表:
Table "public.contacts"
Column | Type | Modifiers | Storage | Stats target | Description
--------------------+-----------------------------+-------------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('contacts_id_seq'::regclass) | plain | |
created_at | timestamp without time zone | not null | plain | |
updated_at | timestamp without time zone | not null | plain | |
external_id | integer | | plain | |
email_address | character varying | | extended | |
first_name | character varying | | extended | | …Run Code Online (Sandbox Code Playgroud) 我们在 Windows 2008 Server 上运行 Postgres 9.0。有一个大表包含一bytea列,用于存储每行 0-5MB 的二进制数据:
CREATE TABLE files
(
file_id serial NOT NULL,
data bytea NOT NULL,
on_disk boolean,
CONSTRAINT files_pkey PRIMARY KEY (file_id)
)
Run Code Online (Sandbox Code Playgroud)
最近我们一直在更新每一行的 on_disk 字段(不涉及数据字段)。我们认为这已经占用了我们临时表空间(或其他东西)中的空间,原因有两个:
1) 我们开始在运行大型查询的系统的其他随机部分收到此错误:
ERROR: 53100: could not write block 92271 of temporary file
Run Code Online (Sandbox Code Playgroud)
2) 我们的可用空间在一周内从 ~7GB 下降到 1.5GB,这是不寻常的。
任何人都可以确认:
a) 在 postgres 中更新一行是否会导致它在不释放旧空间的情况下重写整个行(包括大型二进制数据)?这将解释我们的症状
b) 它是否在更改期间写入其他临时表空间,这也会占用空间?(我们可以强制释放临时空间吗?)
c) 有没有一种方法可以对这个表执行次要的布尔字段更新,而无需每次都重写行(&咀嚼磁盘空间)?
d) 我们可以在不重写整个表的情况下定期强制 postgres 释放已用空间吗?(我们已知的释放空间的方法涉及我们没有空间的表重写)
PS:是的,我们正在将我们的服务器迁移到具有更大存储空间的主机......这可能需要 1-2 个月的时间。
给定一个名为PostgreSQL的表requests,该表具有名为的列status和类似这样的约束:
ALTER TABLE requests ADD CONSTRAINT allowed_status_types
CHECK (status IN (
'pending', -- request has not been attempted
'success', -- request succeeded
'failure' -- request failed
));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,psql我可以提取有关此约束的信息:
example-database=# \d requests
Table "public.example-database"
Column | Type | Modifiers
----------------------+-----------------------------+-------------------------------------------------------------------
id | integer | not null default nextval('requests_id_seq'::regclass)
status | character varying | not null default 'pending'::character varying
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not …Run Code Online (Sandbox Code Playgroud) 给定一个大表(1000万到1亿行),添加一些额外(未编入索引)的列的最佳方法是什么?
答案的变化取决于额外的列是密集的(大多数不是空的)还是稀疏的(大多数是空的)?
我在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) 我想存储一组每小时设定点.24个浮点数(0到1),用于将当天的小时数映射到强度值.
我可以:
_0为_23.(如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)(id, value, hour_of_the_day).这些值将主要一起查询并缩放(以便范围0到1映射)自定义范围.
哪种型号更可取?
postgresql database-design sqlalchemy data-modeling python-3.x
我是数据库的新手.最近我开始使用timecaledb,这是PostgreSQL的扩展,所以我猜这也与PostgreSQL有关.
我观察到一种奇怪的行为.我计算了我的表结构,1个时间戳,2个双倍,所以每行总共24个字节.我从csv文件导入(通过psycopg2 copy_from)2,750,182行.我手动计算的大小应该是63MB,但我查询timescaledb,它告诉我的表大小为137MB,指数大小为100MB,总237MB.我期待表格大小应该等于我的计算,但事实并非如此.任何的想法?
postgresql ×11
sql ×5
database ×3
performance ×2
storage ×2
bigdata ×1
diskspace ×1
oracle ×1
python-3.x ×1
sql-server ×1
sqlalchemy ×1
timescaledb ×1
types ×1
windows ×1