唯一索引的行估算实验

简介: 唯一索引的行估算实验 唯一索引除了有业务上约束作用,还可以使行估算更准确。 对唯一索引列的等值条件查询,即使统计信息缺失,也能得到准确的行估算值即1。 实验 创建不收集统计信息的测试表 postgres=# create table t...

唯一索引的行估算实验

唯一索引除了有业务上约束作用,还可以使行估算更准确。 对唯一索引列的等值条件查询,即使统计信息缺失,也能得到准确的行估算值即1。

实验

创建不收集统计信息的测试表

postgres=# create table tbc1(id int) with (autovacuum_enabled=off);
CREATE TABLE
postgres=# insert into tbc1 select * from generate_series(1,10000);
INSERT 0 10000 

查询某唯一值,但行估算为57。

postgres=# explain select * from tbc1 where id =10;
                      QUERY PLAN                       
-------------------------------------------------------
 Seq Scan on tbc1  (cost=0.00..188.44 rows=57 width=4)
   Filter: (id = 10)
(2 rows) 

创建普通索引,行估算仍为50。

postgres=# create index on tbc1(id);
CREATE INDEX
postgres=# explain select * from tbc1 where id =10;
                                QUERY PLAN                                 
---------------------------------------------------------------------------
 Bitmap Heap Scan on tbc1  (cost=2.17..38.17 rows=50 width=4)
   Recheck Cond: (id = 10)
   ->  Bitmap Index Scan on tbc1_id_idx  (cost=0.00..2.16 rows=50 width=0)
         Index Cond: (id = 10)
(4 rows) 

创建唯一索引,行估算变为1和实际吻合。

postgres=# create unique index on tbc1(id);
CREATE INDEX
postgres=# explain select * from tbc1 where id =10;
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Index Only Scan using tbc1_id_idx1 on tbc1  (cost=0.29..3.30 rows=1 width=4)
   Index Cond: (id = 10)
(2 rows) 

唯一索引对行估算的作用不适用于非等值条件,比如范围条件

postgres=# explain analyze select * from tbc1 where id   Bitmap Index Scan on tbc1_id_idx1  (cost=0.00..40.28 rows=3333 width=0) (actua
l time=0.007..0.007 rows=0 loops=1)
         Index Cond: (id 

SQL中也不要在条件字段上附加计算或类型转换,否则即使有唯一索引估算也不会准。

postgres=# explain select * from tbc1 where id::text ='10';
                      QUERY PLAN                       
-------------------------------------------------------
 Seq Scan on tbc1  (cost=0.00..220.00 rows=50 width=4)
   Filter: ((id)::text = '10'::text)
(2 rows) 

由于关闭auto_autovacuum,测试过程中全程测试表统计信息都为空

postgres=# select * from pg_stats where tablename='tbc1';
 schemaname | tablename | attname | inherited | null_frac | avg_width | n_distinct | 
most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_e
lems | most_common_elem_freqs | elem_count_histogram 
------------+-----------+---------+-----------+-----------+-----------+------------+-
-----------------+-------------------+------------------+-------------+--------------
-----+------------------------+----------------------
(0 rows)
相关文章
|
1月前
|
SQL 关系型数据库 分布式数据库
在PolarDB中,行数评估是通过对表的统计数据、基数估计以及算子代价模型来进行估算的。
【2月更文挑战第14天】在PolarDB中,行数评估是通过对表的统计数据、基数估计以及算子代价模型来进行估算的。
84 1
|
20天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
6月前
|
数据可视化 数据挖掘
R实战 | 置换多元方差分析(以PCoA的PERMANOVA分析为例)
R实战 | 置换多元方差分析(以PCoA的PERMANOVA分析为例)
261 0
|
SQL 存储 算法
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(二)|学习笔记
快速学习PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(二)
288 0
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(二)|学习笔记
|
SQL XML JSON
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(一)|学习笔记
快速学习PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(一)
488 0
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(一)|学习笔记
|
SQL 移动开发 关系型数据库
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)|学习笔记
快速学习PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)
547 0
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)|学习笔记
|
人工智能 BI
估算
估算
66 0
|
SQL 存储 缓存
索引不是越多越好,理解索引结构原理,才有助于我们建立合适的索引!
MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引。
589 0
|
SQL 存储 监控
为什么要关注索引统计误差
为什么要关注索引统计误差
|
SQL 关系型数据库 MySQL
【MySQL优化】避免索引失效的十个关键点,你都知道那些?
【MySQL优化】避免索引失效的十个关键点,你都知道那些?
354 1

热门文章

最新文章