有没有人有一个指导计算postgresql中各种操作的复杂性?如选择,加入(在from和where中),组,聚合,笛卡尔等产品?
我正在寻找Big O符号的东西.
您要求的不是也不可能存在,因为操作类型和复杂性之间没有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)复杂性.
答案取决于指数的质量。一般用二进制块大小。如果没有索引,则搜索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)
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |