PostgreSQL中数据库操作的复杂性?

pet*_*Foo 5 postgresql

有没有人有一个指导计算postgresql中各种操作的复杂性?如选择,加入(在from和where中),组,聚合,笛卡尔等产品?

我正在寻找Big O符号的东西.

Chr*_*ers 7

您要求的不是也不可能存在,因为操作类型和复杂性之间没有1:1的关系.例如,考虑基本的选择操作.这可以映射到各种计划,计划员就每个计划的估计复杂性做出决策.例如,假设我们:

CREATE TABLE my_index_test (id int primary key); -- creates an index too!
EXPLAIN ANALYZE SELECT * FROM my_index_test where id = 0;

                                            QUERY PLAN                      

--------------------------------------------------------------------------------
---------------------------
Seq Scan on my_index_test  (cost=0.00..34.00 rows=2400 width=4) 
    (actual time=0.003..0.003 rows=0 loops=1)
  Total runtime: 0.045 ms
 (2 rows)
Run Code Online (Sandbox Code Playgroud)

现在,在这种情况下,规划者(正确地)决定使用索引是不必要的复杂性.因此,即使是简单的查询也有多种可能性,PostgreSQL会尝试根据它所知道的选择最不复杂的计划.

一个例外是提交和回滚都具有O(1)复杂性.

  • 可以构建这样的数据库引擎任务列表.当然,困难在于做出决策并不是很好,因为你无法对计划者进行那么多的微观管理.就索引而言,它涉及二进制搜索,但是根据索引类型,它可能还涉及更多.另一件事是你在PostgreSQL上有相当多种类的索引.... (2认同)

Léo*_* 준영 5

答案取决于指数的质量。一般用二进制块大小。如果没有索引,则搜索O(n)。如果有索引,则搜索为O(log n). 您还可以设置要在哪个索引中使用哪个数据结构。例如,这里使用 B 树作为部分索引的方法,以及这里关于二元运算的不同操作的复杂性:

        Average     Worst case
Space   O(n)        O(n)
Search  O(log n)    O(log n)
Insert  O(log n)    O(log n)
Delete  O(log n)    O(log n)
Run Code Online (Sandbox Code Playgroud)

做简单的测试。底层块大小影响对数速度,我有一个线程关于B树的部分索引的块大小是多少?因为log_b n这是对数事物的完成方式,这使得操作比默认的二进制操作更快,但可能会产生一些空间成本(不知道如何在那里呈现它):

        Average     Worst case
Space   O(n)        O(n)         % not sure about this here
Search  O(log_b n)  O(log_b n)
Insert  O(log_b n)  O(log_b n)
Delete  O(log_b n)  O(log_b n)
Run Code Online (Sandbox Code Playgroud)