相关疑难解决方法(0)

在PostgreSQL中计算和节省空间

我有一个像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太字节.我可以使用什么技巧来压缩这个表?我的可能想法如下......

将 …

postgresql storage database-design bigdata

58
推荐指数
4
解决办法
2万
查看次数

使用postgresql DB存储NULL值需要多少磁盘空间?

假设我的表上有一列定义了以下内容:

"MyColumn" smallint NULL
Run Code Online (Sandbox Code Playgroud)

存储类似0,1或其他值的值应该需要2个字节(1).但是如果我将"MyColumn"设置为NULL,需要多少空间?它需要0个字节吗?

是否有一些额外需要的字节用于管理目的或每个列/行的此类事项?

(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

sql postgresql types nullable

40
推荐指数
2
解决办法
9860
查看次数

在大型数据集上删除Postgres中的列

所以我有一个包含大型数据集的表,这个表有三列我想删除.
问题是:Postgres将如何处理它?

它会遍历每个条目还是只是更新映射信息而没有太多开销?ALTER TABLE在这种特殊情况下,我可以只使用或应该使用交换表吗?

并且,如果它有任何区别,则所有三列都具有固定长度(两个整数和一个数字).

如果已经有人问过我很抱歉,但谷歌找不到任何相关的问题/文章......

postgresql ddl database-design database-performance postgresql-9.2

24
推荐指数
2
解决办法
9224
查看次数

在PostgreSQL中不使用NULL仍然在标题中使用NULL位图?

显然,PostgreSQL在每个数据库行标题中存储了几个值.

如果我不在该表中使用NULL值 - 是否仍然存在空位图?
定义列有NOT NULL没有区别?

postgresql null storage database-design

13
推荐指数
1
解决办法
3827
查看次数

我可以在Heroku上的5 MB PostgreSQL中存储多少条记录?

我要将记录存储在一个包含2个字段的表中:

  • id - > 4个字符

  • password_hash - > 64个字符

我可以在Heroku上的5mb PostgreSQL中存储多少个像上面那样的记录?

PS:给定一个包含x列且长度为y的表 - 如何计算数据库中的空间?

postgresql storage database-design heroku

9
推荐指数
1
解决办法
6595
查看次数

数据库性能:使用一个具有最大值的实体/表.可能的属性或拆分到不同的实体/表?

我需要设计一些数据库表,但我不确定性能影响.在我的情况下,它更多地关于读取性能而不是保存数据.

情况

借助模式识别,我可以找到需要在postgresql数据库中保存多少某个对象的值.其他数量让我们说固定属性唯一的区别是需要保存相同类型的1,2或3个值.

目前,我有3个实体/表,它们的区别仅在于具有相同类型的1,2或3个不可空的属性.

例如:

EntityTestOne/TableOne {
    ... other (same) properties
    String optionOne;
}

EntityTestTwo/TableTwo {
    ... other (same) properties
    String optionOne;
    String optionTwo;

}

EntityTestThree/TableThree {
    ... other (same) properties
    String optionOne;
    String optionTwo;
    String optionThree;
}
Run Code Online (Sandbox Code Playgroud)

我希望生产中有数百万条记录,并且我正在考虑这种变体的性能影响以及可能的替代方案.

备择方案

我想到的其他选择:

  • 仅使用一个具有3个选项的实体类或表(optionTwo和optionThree将可为空).如果谈论数以百万计的预期记录加上缓存,我问自己,在至少两个(缓存)层(数据库本身和休眠)中保存数百万个空值并不是一种"浪费".在另一个答案中,我昨天读到在postgresql中保存一个空值只需要1比特我认为如果我们谈论数百万条记录可以包含一些可以为空的属性(链接)那么多.
  • 创建另一个实体/表并使用集合(列表或集)关系

例如:

EntityOption {
    String value;
}

EntityTest {
    ... other (same) properties
    List<EntityOption> options;
}
Run Code Online (Sandbox Code Playgroud)
  • 如果要使用此关系:在创建新记录的情况下,什么会提供更好的性能:为每个新的EntityTest创建新的EntityOption或在之前进行查找并引用现有的EntityOption(如果存在)?稍后获取它们时的读取性能以及当时需要的连接怎么样?与具有三个选项的一个普通实体的变体相比,我可以想象它可能会稍慢......

由于我不是那么强大的数据库设计和使用hibernate我对这些方法的优缺点感兴趣,如果有更多的选择.我甚至想问一个问题,如果postgresql是正确的选择,或者是否应该考虑使用另一个(免费)数据库.

谢谢!

database postgresql database-design hibernate

8
推荐指数
1
解决办法
195
查看次数

计算元组大小

我试图了解列顺序如何最小化PostgreSQL中的表大小.

例:

CREATE TABLE test (
 column_1 int
,column_2 int
,column_3 bigint
,column_4 bigint
,column_5 text
,column_6 text
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_9 timestamp
,column_10 boolean
,column_11 boolean
);

INSERT INTO test
  VALUES(1,1,1,1,'test','test_1',12,12,current_timestamp,true,false);

SELECT pg_column_size(test.*) FROM test;

 pg_column_size 
----------------
       82
    (1 row)
Run Code Online (Sandbox Code Playgroud)

元组大小:

元组头的23字节开销+ NULL位图的1字节,因此:

24 + 4 + 4 + 8 + 8 + 5 + 7 + 5 + 5 + 8 + 1 + 1 = 80但实际元组大小为82.

是否有2字节的额外开销?

我理解下面链接给出的例子:
在PostgreSQL中计算和节省空间

如果我们删除column_8 numeric(5,2)那么那么元组大小保持不变,即:82.

我重新排序表以最小化元组大小并给出80.

CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql storage database-design

7
推荐指数
1
解决办法
2369
查看次数

针对多列的hstore用例

我在决定使用哪种方法时遇到了一些麻烦.

我有几个实体"类型",让我们称它们为A,B和C,它们共享一定数量的属性(大约10-15).我创建了一个名为ENTITIES的表,以及每个常用属性的列.

A,B,C也有一些(大部分)唯一属性(所有布尔值,可以是10到30左右).我不确定在对表建模时遵循的最佳方法是什么:

  1. 在ENTITIES表中为每个属性创建一个列,这意味着不共享该属性的实体类型将只具有空值.
  2. 对每个实体类型的唯一属性使用单独的表,这有点难以管理.
  3. 使用hstore列,每个实体都将在此列中存储其唯一标志.
  4. ???

我倾向于使用3,但我想知道是否有更好的解决方案.

postgresql database-design hstore

6
推荐指数
1
解决办法
2063
查看次数

填充顺序索引为PK的因子

是的,再次填充因子.我花了很多时间阅读,我无法确定每个案例哪个是更好的填充因子.问题是我不明白何时以及如何进行碎片化.我正在将数据库从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和索引填充因子的好链接.

sql postgresql

2
推荐指数
1
解决办法
1917
查看次数

Postgres 9.x 中 CHECK 约束的成本是多少?

我有一个有 60 列的表。其中 20 个是“NotEmpty”,6 个是“NotNull”。

我有空值和 Null 值(在我的情况下总是意味着“没有数据”)。我想将列与一种类型的约束统一起来。

我读过空值很便宜(以字节大小计)。那么也许使用 NotEmpty 约束?但也许 NotNull 约束表现更好?coalesce()或者也许在检索数据时同时拥有值和使用会更好?

Postgres 9.x 中的约束CHECK成本是多少?你的经历怎么样?有什么基准吗?INSERTUPDATE

sql postgresql benchmarking check-constraints postgresql-9.1

1
推荐指数
1
解决办法
3094
查看次数