0

是否有“官方基准”或简单的经验法则来决定空间或性能何时会受到影响?


我的表有许多简单的索引字段,

CREATE TABLE t (
  id serial PRIMARY KEY,
  name varchar(250) NOT NULL, 
  ...
  xcontent xml, -- the NULL use disk space?? cut performance?
  ...
  UNIQUE(name)
);

而且它是一种“稀疏内容”,很多xcontent值都会是 NULL... 那么,这些 XML NULL 会消耗一些磁盘空间吗?


笔记

我可以正常化,t现在的表格将是nt

CREATE TABLE nt (
  id serial PRIMARY KEY,
  name varchar(250) NOT NULL, 
  ...
  UNIQUE(name)
);

CREATE TABLE nt2 (
  t_id int REFERENCES nt(id),
  xcontent xml NOT NULL
);

CREATE VIEW nt_full AS 
   SELECT nt.*, nt2.xcontnt FROM nt LEFT JOIN nt2 ON id=t_id;

那么,我需要这种复杂性吗?这个新的表排列将消耗更少的磁盘空间。指某东西的用途

SELECT id, name FROM nt WHERE name>'john';      -- Q1A 
SELECT id, name FROM nt_full WHERE name>'john'; -- Q1B
SELECT id, name FROM t WHERE name>'john';       -- Q1C

SELECT id, xcontent FROM nt_full WHERE name>'john'; -- Q2A
SELECT id, xcontent FROM t WHERE name>'john';       -- Q2B

那么,理论上,Q1A vs Q1B vs Q1C 的所有表现都会一样吗?
Q2A 与 Q2B?

4

2 回答 2

2

“空值占用多少空间”问题的答案是:根本没有空间 - 至少不在“数据”区域。

对于表中的每个可为空的列,行标题中有一个将列值标记为空(或非空)。因此,空值所占用的“空间”已经存在于行标题中——无论该列是否为空。

因此,空“值”不占用存储该行的数据块中的任何空间。

这记录在手册中:http ://www.postgresql.org/docs/current/static/storage-page-layout.html


如果超过某个阈值(大约 2000 字节),Postgres 将不会在实际数据块中存储长字符串值(xml、varchar、text、json、...)。如果该值长于该值,它将存储在“远离”您的实际数据的特殊存储区域中。因此,将表拆分为具有 1:1 关系的两个表对您来说并不那么重要。除非您存储大量行(数亿行),否则我怀疑您是否能够注意到差异 - 但这也取决于您的使用模式。

“离线”存储的数据也会自动压缩。

有关此的详细信息可以在手册中找到:http ://www.postgresql.org/docs/current/static/storage-toast.html


单独的表可能具有优势的一个原因是必要的“真空”清理。如果您更新 XML 数据很多,但表的其余部分几乎没有更改,那么将其拆分为两个表可能会提高整体性能,因为“XML 表”将需要较少的“维护”而“主”表不会完全改变。

于 2015-12-17T22:41:55.923 回答
0

varchar 字段比内容多消耗 2 个字节。因此,如果将其定义为 varchar(250) 并放入 10 个字符,它会消耗 12 个字节 100 个字符会消耗 102 个字节 NULL 会消耗 2 个字节。没问题。

如果您在某些情况下需要存储大量 xml 数据并最终使用(例如)blob 类型,则应将其放在另一个表中并保持主表精简和快速

于 2015-12-17T21:59:58.447 回答