1

So, it seems to me like a query on a table with 10k records and a query on a table with 10mil records are almost equally fast if they are both fetching roughly the same number of records and making good use of simple indexes(auto increment, record id type indexed field).

My question is, will this extend to a table with close to 4 billion records if it is indexed properly and the database is set up in such a way that queries always use those indexes effectively?

Also, I know that inserting new records in to a very large indexed table can be very slow because all the indexes have to be recalculated, if I add new records only to the end of the table can I avoid that slow down, or will that not work because the index is a binary tree and a large chunk of the tree will still have to be recalculated?

Finally, I looked around a bit for a FAQs/caveats about working with very large tables, but couldn't really find one, so if anyone knows of something like that, that link would be appreciated.

4

4 回答 4

1

Here is some good reading about large tables and the effects of indexing on them, including cost/benefit, as you requested:

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

于 2010-10-14T01:13:11.370 回答
1

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

当您插入新行时,您无法控制它们在表的物理布局中的插入位置,因此我假设您的意思是“表的末尾”,即使用被索引的最大值。我知道 Oracle 在这种情况下对叶块拆分进行了一些优化,但我不知道 Postgres。

于 2010-10-27T02:25:09.540 回答
1

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

如果您可以将“热”(即经常访问的索引页面)放入内存,那么访问通常会很快。

用于索引非常大的表的策略是使用分区表和分区索引。但是,如果您的查询没有加入或过滤分区键,那么与未分区表相比,性能将不会有所提高,即没有分区消除。

SQL Server 数据库分区的神话和真相

Oracle 分区表和索引

保持索引尽可能窄是非常重要的。

Kimberly Tripp 的聚簇索引辩论继续……(SQL Server)

于 2010-10-14T01:59:29.383 回答
0

如果它被正确索引,插入性能可能会比选择性能受到更多的影响。PostgreSQL 中的索引有大量选项,可以让您索引表的一部分或表中元组上不可变函数的输出。此外,索引的大小(假设它可用)对速度的影响比实际扫描表的速度要慢得多。最大的区别在于搜索树和扫描列表。当然,您仍然有磁盘 I/O 和内存开销会影响索引的使用,因此大型索引的性能不如理论上的好。

于 2012-09-07T06:23:16.330 回答