2010-10-14 58 views
1

所以,在我看来,对于具有10k条记录的表的查询和对具有10条记录的表的查询几乎同样快,如果它们都获取大致相同数量的记录并充分利用简单索引(auto增量,记录id类型索引字段)。有效索引能够在多大程度上克服非常大的表的性能问题?

我的问题是,这将延伸到与接近4条十亿记录的表,如果它是正确索引,数据库是建立在这样一种方式,查询始终有效地利用这些指标?

此外,我知道将新记录插入到一​​个非常大的索引表中可能会非常缓慢,因为如果我只将新记录添加到表的末尾,所有索引都必须重新计算,那么我可以避免这种减速,还是不行,因为索引是一棵二叉树,并且树的大块仍然需要重新计算?

最后,我四处张望了一下大约有非常大的表工作一个常见问题/警告,但未能真正找到一个,所以如果有人的类似的东西都知道,链接,将不胜感激。

+0

PostgreSQL的性能取决于不止多少条记录。但是一般来说,如果你有数十亿条记录,那么数据库将会变慢,即使有很多RAM。虽然RAM速度很快,但您仍然需要查找/读取/读取数据,然后对数据执行计算。请记住,“较慢”是一个相对术语。没有Hadoop之类的东西,数据库一直在增强内存和CPU以提高性能。 – vol7ron 2010-10-14 04:02:26

+0

如果你打算使用非常大的表格,你可能想要考虑类似NoSQL的数据库,比如Hadoop;使用map reduce来分配服务器节点的工作。 – vol7ron 2010-10-14 04:04:45

+1

“如果你打算使用非常大的表格”定义非常大的表格。 – Kuberchaun 2010-10-14 14:13:01

回答

1

这里是关于大表和索引的对他们的影响,包括成本/效益一些良好的阅读,为你的要求:

http://www.dba-oracle.com/t_indexing_power.htm

+0

引用的文章没有深入调查索引非常大的表。它只是讨论索引的基础知识。 – 2010-10-14 01:43:41

1

索引非常大的表(与任何数据库相关的)取决于在许多因素上,包括您的访问模式,读取与写入的比例以及可用RAM的大小。

如果你能适应你的“热”(即经常访问的索引页)到内存中,然后访问通常会很快。

用于索引非常大的表的策略,采用分区表和分区索引。 但是如果你的查询没有加入或过滤分区键,那么在没有分区的表上性能没有提高,即没有分区消除。

SQL Server Database Partitioning Myths and Truths

Oracle Partitioned Tables and Indexes

这是保持你的指标尽可能窄很重要。

Kimberly Tripp's The Clustered Index Debate Continues...(SQL Server)

1

通过唯一索引查找访问数据将放缓为表变得非常大,但不是很大。索引在Postgres中存储为B树结构(不是每个节点只有两个子节点的二叉树),所以10k行表可能有2个级别,而10B行表可能有4个级别(取决于行)。所以当表格变得很大时,它可能会达到5级或更高,但这只意味着读取一个额外的页面,因此可能不明显。

当您插入新行,你无法控制,他们被插入到表的物理布局,所以我假定你的意思是“表结束”使用被索引的最大值的条款。在这种情况下,我知道Oracle在叶块分裂方面有一些优化,但我不知道Postgres。

0

如果正确编制索引,插入性能可能会受到的影响大于选择性能。 PostgreSQL中的索引有大量的选项,可以让你索引表的一部分或表中元组的不可变函数的输出。如果索引的大小可用,索引的大小将比实际扫描表的速度慢得多。最大的区别在于搜索树和扫描列表。当然,你仍然有磁盘I/O和内存开销进入索引使用,所以大型索引的性能不如理论上可以达到的。