我有一个关于我的数据库大小的简短问题。我需要在数据库中插入数据。在插入之前,需要进行一些计算。
关键是:从 50 mb 纯数据(~700,000 行),这导致 600 mb db 大小。这是12倍!我确定我在这里做错了什么。你能帮我缩小我的数据库的大小吗?数据库大小的来源是 web postgres 管理界面。
这是插入:
CREATE TYPE CUSTOMER_TYPE AS ENUM
('enum1', 'enum2', 'enum3', '...', 'enum15'); ## max lenght of enum names ~15
CREATE TABLE CUSTOMER(
CUSTOMER_ONE TEXT PRIMARY KEY NOT NULL, ## max 35 char String
ATTRIBUTE_ONE TEXT UNIQUE, ## max 35 char String
ATTRIBUTE_TWO TEXT UNIQUE, ## max 51 char String
ATTRIBUTE_THREE TEXT UNIQUE, ## max 52 char String
ATTRIBUTE_FOUR TEXT UNIQUE, ## max 64 char String
ATTRIBUTE_FIFE TEXT UNIQUE, …Run Code Online (Sandbox Code Playgroud) 据我所知的基本区别CHAR和VARCHAR数据类型,它CHAR占用的固定长度,而VARCHAR占用空间基于正被存储的内容。
但是如果VARCHAR根据存储的内容动态处理空间管理如此有效,为什么数据库支持CHAR数据类型,所有CHAR(n)字段都可以是VARCHAR(n)字段,对吧?
在我的收藏中,我的文档似乎比较相似。我需要知道我的生产服务器需要多少存储空间来存储我的文档,这就是我查询的原因:
db.collectionName.stats()
Run Code Online (Sandbox Code Playgroud)
我的字段 avgObjSize 大约为 6442 字节。我在我的收藏中选择了一个随机文档,我输入:
Object.bsonsize(db.collectionName.find({"_id" : ObjectId("5508497c51a990da07b07106")}))
Run Code Online (Sandbox Code Playgroud)
我获得了 810 个字节。
为什么我有这么大的差异?
我还注意到,我存储的文档越多,avgObjSize 减少的越多……这正常吗?(我查过,我的文件不是空的。)
它是一个开发服务器,所以我使用的是 Red Hat Enterprise Linux 5.8,它是一个 32 位版本。
我可以在 2 个节点之间共享 VMDK 以进行 SQL Server 故障转移群集设置的主动被动设置吗?
我看到的大多数文章都提到使用 RDM,但是我们在环境中使用 Veeam 备份,并且它不支持 RDM。
这个 SO 答案概述了 MySQL 如何将其数据库组织成文件,但没有描述文件本身的结构。
我想知道,在物理层面,关系数据库管理系统如何将它们的记录存储在文件中。文件的大致结构是什么,列/值在哪里(如果它只是一个 CSV),以及它是如何遍历的。
我的直觉是NULL将比{}用作ARRAY[]PostgreSQL 中列的默认值时占用的空间更少。
我对么?
我们要计算表中每一行的总“行上”存储字节数。正如我们所理解的,我们必须将每一列的 DATALENGTH() 相加,同时还要考虑 NULL 和诸如 VARCHAR(MAX) 之类的东西,它们在“行”上只有一个 24 字节的指针。我们知道每一行也有一些开销,这在下面的查询中没有考虑。
SELECT ROW_ID,
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL1','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL1), 1)
END
+
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL2','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL2), 1)
END
+
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL3','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL3), 1)
END
+
...
...
AS ROW_SIZE
FROM EXAMPLE_TABLE
ORDER BY ROW_SIZE DESC
;
Run Code Online (Sandbox Code Playgroud)
多么野兽!而且这只是一个近似值。
然后我们发现
DBCC SHOWCONTIG ('EXAMPLE_TABLE') WITH TABLERESULTS
Run Code Online (Sandbox Code Playgroud)
返回最大记录大小。这表明 SQL Server 中已经有一个算法可以计算行的确切大小。
我们如何直接访问该算法?
我有两个表,其中一个或多或少包含另一个的数据子集。我从第一个表中删除了一些数据,这些数据作为历史数据插入到第二个表中。
这些是定义:
CREATE TABLE [dbo].[CIC_DESLUNGHE](
[CD_CIC_DESLUNGHE] [bigint] IDENTITY(1,1) NOT NULL,
[CD_CIC_PRODUZIONE] [bigint] NOT NULL,
[CD_CIC_OPERAZIONI] [bigint] NOT NULL,
[AFNMPROG] [int] NOT NULL,
[AFDSLINE] [nvarchar](max) NULL,
CONSTRAINT [PK_CIC_DESLUNGHE] PRIMARY KEY CLUSTERED
(
[CD_CIC_DESLUNGHE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 99) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[CIC_DESLUNGHE_STORICI](
[CD_CIC_DESLUNGHE_STORICI] [bigint] IDENTITY(1,1) NOT NULL,
[CD_CIC_PRODUZIONE_STORICI] [bigint] NOT NULL,
[CD_CIC_OPERAZIONI_STORICI] [bigint] NOT NULL,
[AFNMPROG] [int] NOT NULL, …Run Code Online (Sandbox Code Playgroud) varchar(5)当我在查询中使用时INSERT,这意味着表中的属性将在内存中占用5 个字节?(假设一个可打印字符占用一个字节)?
根据以下链接,NULL值占用一些存储空间:
/sf/ask/261182071/
https://www.sqlservercentral.com/forums/topic/null-storage-2
如果列具有固定宽度数据类型 -NULL占用列的长度
char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
Run Code Online (Sandbox Code Playgroud)
如果列具有可变宽度 -NULL占用 0 字节
varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
Run Code Online (Sandbox Code Playgroud)
另外,拥有可为空的列也会产生开销。链接中的信息有点矛盾。
任何人都可以阐明这一点吗?
这是我的问题:
有人说可空列的开销是每行 1 位,有人说是每行 1 个字节,
哪一个是正确的?我假设每行 1 位(因此 8 行构成 1 个字节),对吗?
对于 varchar 中的 NULL 值,每行仍然有 2 个字节的开销 - 这是真的吗?
最重要的问题:
我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小
添加的列:
alter table MyTable add TestVarchar10 varchar(10) …Run Code Online (Sandbox Code Playgroud) storage ×10
postgresql ×4
sql-server ×4
datatypes ×2
size ×2
clustering ×1
datafile ×1
dbcc ×1
memory ×1
mongodb ×1
null ×1
sql-standard ×1
varchar ×1