如何使用表格大小从表格中进行选择?

时间:2015-05-25 10:57:31

标签: database postgresql

当我搜索满足某个条件的行时:

SELECT something FROM table WHERE type = 5;

在包含10K和10M行的表上执行此查询时,它是否存在线性差异?

换句话说 - 在10K桌上进行这种查询的速度比在10M桌上制作快1000倍?

我的表格中包含一列type,其中包含110的数字。此表上最常见的查询将是上面的查询。如果性能差异为真,我将为每种类型制作10个表以获得更好的性能。如果这不是真正的问题,我将有两个表 - 一个用于types,第二个表用于带有type_id列的数据。

修改 有多个行type值。

1 个答案:

答案 0 :(得分:2)

(答案最初标记为,答案就是这些条款。其他DBMS会有所不同。)

与大多数超级广泛的问题一样,"它取决于"。

如果没有索引存在,那么时间可能大致是线性的,但几乎是固定的启动成本加上一些断点 - 例如从表格适合RAM到不再适合RAM时。各种各样的效果可以发挥作用 - 内存银行和NUMA,磁盘预读,底层磁盘子系统中的并行性,文件系统上的碎片,表中的MVCC膨胀等 - 使这个简单。

如果有问题的属性的b树索引将以低于线性的速率增加 - probably around O(log n)。根据索引是否适合RAM,表是否适合RAM等等而变化多少。但是,PostgreSQL通常必须为每个索引指针执行堆查找,这会随机添加I / O成本相当不可预测,具体取决于数据分发/集群,缓存和预读等。它可能能够进行仅索引扫描,在这种情况下,如果真空运行足够,则可以避免这种辅助查找。

所以...在简化术语中,没有索引= O(n),索引为〜= O(log n)。非常,非常近似。

我认为问题的根本意图是:拥有1000个1000行的表或1个1,000,000行的表是否更快?。如果是这样的话:在绝大多数情况下,单个较大的表将是性能和管理的更好选择。