有没有人有指导计算postgresql中各种操作的复杂性? 如选择,加入(在from和where中),组,聚合,笛卡尔等产品?
我正在寻找Big O表示法中的内容。
答案 0 :(得分: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)
现在,这种情况下的规划者(正确地)决定使用索引是不必要的复杂性。因此,即使是简单的查询也有多种可能性,PostgreSQL会尝试根据它所知道的选择最不复杂的计划。
一个例外是提交和回滚都具有O(1)复杂性。
答案 1 :(得分:4)
答案取决于索引的质量。
Gerenarally用二进制块大小。
如果没有索引,则搜索为O(n)
。
如果是索引,则搜索为O(log n)
。
您还可以设置要在哪个索引中使用的数据结构。
例如,B-tree作为部分索引here的方法,以及关于二进制操作的不同操作here的复杂性:
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)
进行简单的测试。
底层块大小影响对数速度,我有一个线程What is the block size of Partial Index with B-tree?,因为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)