数据库如何处理不适合内存的数据表?

时间:2009-11-12 20:28:57

标签: database

假设您有一个非常大的表,比如几十亿个无序行,现在您想要将其编入索引以便快速查找。或者您可能要批量加载它并在具有聚簇索引的磁盘上进行订购。显然,当你获得这么大的数据时,你必须停止假设你可以做一些事情,比如在内存中进行排序(好吧,不是没有去虚拟内存并且会受到巨大的性能影响)。

有人能给我一些关于数据库如何处理大量数据的线索吗?我猜有些算法使用某种形式的智能磁盘缓存来处理所有数据,但我不知道从哪里开始。参考文献特别受欢迎。也许是高级数据库教科书?

5 个答案:

答案 0 :(得分:6)

Multiway Merge Sort是一个用于排序大量内存的关键字

答案 1 :(得分:1)

据我所知,大多数索引使用某种形式的B-trees,它不需要在内存中有东西。您可以简单地将树的节点放在一个文件中,然后跳转到文件中的varios位置。这也可以用于排序。

答案 2 :(得分:0)

您正在构建数据库引擎吗?

编辑:我在90年代中期建立了一个基于光盘的数据库系统。

固定大小的记录是最容易使用的,因为用于查找记录的文件偏移量可以很容易地计算为记录大小的倍数。我也有一些可变记录大小。

我的系统需要针对阅读进行优化。数据实际存储在CD-ROM上,因此它是只读的。我为我想要搜索的每个列创建了二叉搜索树文件。我采用了开源内存二进制搜索树实现,并将其转换为对光盘文件进行随机访问。从每个索引文件中分类读取很容易,然后根据索引顺序从主数据文件中读取每个数据记录也很容易。我不需要进行任何内存中排序,系统比当时在客户端计算机上运行的任何可用RDBMS系统都要快。

对于固定记录大小的数据,索引只能跟踪记录号。对于可变长度数据记录,索引只需要在记录开始的文件中存储偏移量,并且每个记录需要以指定其长度的结构开始。

答案 3 :(得分:0)

您必须以某种方式对数据集进行分区。在单独的服务器RAM上展开每个分区。如果我有一个十亿32位的int - 那就是32 GB的RAM。那只是你的索引。

对于低基数数据,例如Gender(只有2位 - 男性,女性) - 您可以用不到一个字节来表示每个索引条目。在这种情况下,Oracle使用位图索引。

答案 4 :(得分:-1)

嗯......有趣的问题。

我认为最常用的数据库管理系统使用操作系统机制进行内存管理,当物理内存结束时,内存表会进行交换。