2009-08-03 289 views
13

我们知道MS Access数据库引擎被“限制”,以允许2GB的最大文件大小(或者可能内部连线被限制为少于2KB的4KB数据页的某些功率)。但是这在实践中意味着什么?MS Access数据库引擎表中的最大行数?

为了帮助我衡量这一点,你能告诉我可以插入MS Access数据库引擎表的最大行数吗?

为了满足表的定义,所有的行必须是唯一的,因此需要一个唯一的约束(例如PRIMARY KEYUNIQUE,CHECK,数据宏等)。

编辑:我意识到有一个理论上的限制,但我感兴趣的是实际(并不一定切实可行),现实生活的限制。

+0

可以插入更新记录的rpimary键值的重复行。 – 2009-08-03 09:39:58

+0

@Ralph Rickenbach:谢谢,我没有想到(doh!)我已经编辑了这个问题来作出一个独特的约束条件。 – onedaywhen 2009-08-03 11:28:58

+1

我不认为这是正确的说Jet/ACE是“扼杀”,因为它可能是内部连线被限制为少于2KB的4KB数据页的功率的一部分(我没有得到任何不错的圆数字尝试了这一点,所以在那里肯定会有一些开销)。虽然它可能不难改变,但它不符合MS的大型产品线的利益,特别是考虑到他们真的以4GB的速度进行THROTTLE SQL Server Express - 我们知道它与完整的SQL Server是相同的引擎,但是具有人造跛行。 – 2009-08-03 19:03:36

回答

7

这里是我的尝试:

我创建了一个单柱(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); 

这就增加了文件大小1467708 KB。

这表明最大值约为8000万大关。

0

这一切都取决于。理论上使用4字节数据类型的单列。你可以存储300 000行。但是即使在你做任何事情之前,数据库中可能还有很多开销。我读了一些你可以拥有1.000.000行的地方,但是又一次,这取决于..

你也可以将数据库链接在一起。限制你自己只有磁盘空间。

+0

4字节记录和300K行的数学根本不相加。我有3个表中超过300K行的长期生产数据库(以及两个表中的一个表),并且记录比单个4字节字段复杂得多。数据文件的大小小于500MB(更像是一半)。 – 2009-08-03 19:07:30

+0

是的,你是对的。我缺少一些零。 (2千兆字节)/(4字节)= 536 870 912 – Tommy 2009-08-04 07:36:46

1

我们不一定在这里谈论理论极限,我们正在讨论2GB最大文件大小和数据库模式的真实世界限制。

  • 是你的db单个表还是 倍数?
  • 每张桌子有多少列?
  • 什么是数据类型?

在确定您可以拥有多少行的情况下,架构与行数保持一致。

我们使用Access MDB来存储MS-SQL数据的输出,供我们的一些企业用户进行统计分析。在这些情况下,我们已经导出了我们的核心表结构,通常是四个表,其中20到150列从每行100字节到每行8000字节以上不等。在这些情况下,我们会碰到数十万行数据是我们将运送它们的PER MDB所允许的。

所以,我只是不认为这个问题有没有你的模式的答案。

+0

我没有模式。面临的挑战是你想出一个可以产生最多行的表的模式(提示:我正在考虑一个唯一的单列表)。 – onedaywhen 2009-08-03 15:00:00

+0

行级锁定也有所不同,因为它会强制每个记录的单个数据页面。 – 2009-08-03 19:08:31

2

自从我上次使用Access以来,已经有好几年了,但是更大的数据库文件通常会遇到更多的问题,并且比小文件更容易发生损坏。

除非数据库文件只被一个人访问或存储在一个健壮的网络中,否则在达到2GB数据库大小限制之前,您可能会发现这是一个问题。

4

正如其他人所说,它是您的架构和索引数量的组合。

一位朋友在接近2 Gb限额的MDB中拥有约100,000,000的历史股价和每日收盘价。

他使用Microsoft知识库文章中的一些代码将其拉下。我很惊讶,无论他使用的服务器在第一个100K记录后都没有关闭他。

他可以在一秒钟内查看任何记录。

12

一些评论:

  1. 喷气/ ACE文件是在数据页为单位,这意味着有是当你的记录边界不与您的数据页对齐一定量的松弛空间。

  2. 行级锁定将大大减少可能的记录数,因为它强制每个数据页一个记录。

  3. 在Jet 4中,数据页大小增加到4KB(从Jet 3.x中的2KB)。由于Jet 4是第一个支持Unicode的Jet版本,这意味着您可以存储1GB的双字节数据(即1,000,000,000个双字节字符),并启用Unicode压缩,2GB数据。所以,记录的数量将受到您是否有Unicode压缩的影响。

  4. 由于我们不知道一个Jet/ACE文件很大的空间是如何采取了由标题和其他元数据,也没有精确索引存储多少空间需要,理论计算的总是要下什么是可行的。

  5. 为了获得最高效的可能存储空间,您希望使用代码创建数据库而不是Access UI,因为Access会创建纯Jet不需要的某些属性。这并不是说有很多这样的设置,因为设置为Access默认值的属性通常不会被设置(只有在您将其从默认值更改为默认值时才会创建该属性 - 这可以通过循环遍历字段属性集合,即为Access表设计器中的字段列出的许多属性在属性集合中不存在,因为它们尚未设置),但您可能想限制自己使用Jet特定的数据类型(超链接字段例如,仅限访问)。

我只是浪费了一个小时,这一点使用赛第一轮()周围碴来填充定义为类型4名字节的字段,复合PK的四个领域,并花了永远追加足够的记录起床任何2GB的重要部分。在200多万条记录中,该文件低于80MB。我在达到 700K 7百万记录和文件压缩到184MBs后终于退出。花费在2GB附近的时间只是我愿意投入的时间!

0

实用=“有用的实践” - 所以你会得到最好的轶事。其他一切只是原型和测试结果。

我同意与他人 - 确定“的记录的最大数量”完全依赖于模式 - #表,#字段,索引#。

另一个轶事为您:我最近击中1.6GB的文件大小与2个主数据存储(表),36和85个字段分别与3代附加表某个子集的副本。

谁在乎,如果数据是唯一或不 - 如果context说,这是唯一的材料。数据是数据,除非重复影响索引器的处理。

总的行数构成该1.6GB的是1.72米。

0

当处理4个大型Db2表格时,我不仅发现了这个限制,而且让一个老板认为我可以将所有四个表格(每个表格都有900,000行)附加到一个大表格上,这对我来说真的很糟糕。真正的生活结果是,无论我尝试过多少次Table(其中有34列 - 30个文本和3个整数),都会吐出一些神秘的消息:“无法打开数据库无法识别的格式或文件可能已损坏”。底线少于1,500,000条记录,只有超过1,252,000条,有34行。