我们知道MS Access数据库引擎被“限制”以允许最大文件大小为2GB(或者内部有线连接限制为少于2KB的4KB数据页的某些功率)。但这在实践中意味着什么?
为了帮助我衡量这一点,您能告诉我可以插入MS Access数据库引擎表的最大行数吗?
为了满足表的定义,所有行必须是唯一的,因此需要唯一约束(例如PRIMARY KEY
,UNIQUE
,CHECK
,数据宏等)。
答案 0 :(得分:12)
一些意见:
Jet / ACE文件在数据页中组织,这意味着当您的记录边界与数据页不对齐时,会有一定的空间。
行级锁定将大大减少可能的记录数量,因为它会强制每个数据页一个记录。
在Jet 4中,数据页面大小增加到4KB(从Jet 3.x中的2KB)。由于Jet 4是第一个支持Unicode的Jet版本,这意味着您可以存储1GB的双字节数据(即1,000,000,000个双字节字符),并且打开Unicode压缩,2GB数据。因此,记录的数量将受到是否进行Unicode压缩的影响。
由于我们不知道Jet / ACE文件中有多少空间被标题和其他元数据占用,也不知道房间索引存储占用了多少空间,因此理论计算总是在实用。
为了获得最有效的存储空间,您需要使用代码来创建数据库而不是Access UI,因为Access会创建纯Jet不需要的某些属性。这并不是说有很多这些,因为设置为Access默认值的属性通常根本没有设置(仅当您从默认值更改属性时才创建属性 - 这可以通过循环遍历字段来看到)属性集合,即为Access表设计器中的字段列出的许多属性在属性集合中没有,因为它们尚未设置),但您可能希望将自己限制为特定于Jet的数据类型(超链接字段)例如,仅限访问权限。
我只是浪费了一个小时来使用Rnd()来填充定义为类型字节的4个字段,在四个字段上使用复合PK,并且需要永久地附加足够的记录以获得2GB的任何重要部分。超过200万条记录,该文件低于80MB。在达到 700K 7百万记录后,我终于退出,文件压缩到184MB。起床接近2GB所需的时间比我愿意投入的时间还要多!
答案 1 :(得分:8)
这是我的尝试:
我创建了一个没有键的单列(INTEGER
)表:
CREATE TABLE a (a INTEGER NOT NULL);
从1开始依次插入整数。
当它插入了65,632,875行时,我停止了它(在数小时后任意)。 文件大小为1,029,772 KB。
我压缩了文件,将文件缩小到1,029,704 KB。
我添加了PK:
ALTER TABLE a ADD CONSTRAINT p PRIMARY KEY (a);
将文件大小增加到1,467,708 KB。
这表明最大值大约在8000万左右。
答案 2 :(得分:4)
正如其他人所说,它是你的架构和索引数量的组合。
一位朋友在接近2 Gb限额的MDB中有大约100,000,000历史股票价格,即每日收盘价。
他使用Microsoft知识库文章中的一些代码将其删除。我很惊讶他使用的任何服务器都没有在最初的100K记录之后将其切断。
他可以在一秒钟内查看任何记录。
答案 3 :(得分:2)
自从我上次使用Access以来已经有好几年了,但是较大的数据库文件总是比较小的文件更容易出现问题并且更容易出现损坏。
除非数据库文件仅由一个人访问或存储在健壮的网络中,否则在达到2GB数据库大小限制之前,您可能会发现这是一个问题。
答案 4 :(得分:1)
我们不一定在这里谈论理论限制,我们讨论的是2GB最大文件大小和数据库架构的真实世界限制。
架构与行数一致,确定您可以拥有多少行。
我们使用Access MDB来存储MS-SQL数据的导出,以供我们的一些企业用户进行统计分析。在这些情况下,我们已经导出了我们的核心表结构,通常是四个表,每列有20到150列,从每行100个字节到每行8000个字节不等。在这些情况下,我们会碰到几十万行数据,允许我们运送它们的每个MDB。
所以,我认为没有你的架构,这个问题没有答案。
答案 5 :(得分:0)
一切都取决于。理论上使用具有4字节数据类型的单列。你可以存储30万行。但是在你做任何事情之前,数据库中可能还有很多开销。我读了一些你可以拥有1.000.000行的地方,但这又取决于......
您还可以将数据库链接在一起。仅限于磁盘空间。
答案 6 :(得分:0)
实用='在实践中有用' - 所以你得到的最好的是轶事。其他一切只是原型设计和测试结果。
我同意其他人 - 确定'最大记录数量'完全依赖于架构 - #tables,#fields,#index。
另一个轶事:我最近的文件大小为1.6GB,包含2个主要数据存储(表),分别为36和85个字段,另外3个表中有一些子集副本。
谁在乎数据是否是唯一的 - 只有在上下文所说的情况下才是唯一的。数据是数据是数据,除非重复影响索引器的处理。
构成1.6GB的总行数是1.72M。
答案 7 :(得分:0)
当使用4个大型Db2表时,我不仅找到了限制,但它让我看起来非常糟糕,因为老板认为我可以将所有四个表(每个表超过900,000行)附加到一个大表中。现实生活中的结果是,无论我多少次尝试过Table(其中有34列--30个文本和3个整数)都会吐出一些含糊不清的消息"无法打开数据库无法识别的格式或文件可能已损坏&# 34 ;.底线不到1,500,000条记录,只有1,252,000条,有34行。