暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓KingbaseES通过表达式索引准确估计选择率

原创 数据猿 2023-12-26
183


KingbaseES通过表达式索引准确估计选择率

关键字:

优化器、表达式统计信息、表达式索引、人大金仓、KingbaseES、

一、摘要

本文介绍了KingbaseES通过表达式索引准确估计选择率的方法。

表达式索引

表达式索引是数据库中一种特殊类型的索引,它基于表达式而不是列或列的组合。表达式索引允许在索引中存储计算得到的值,而不仅仅是列的原始值。这样可以提高查询性能并支持更杂的查询操作。

选择率

表达式索引有以下优势:选择率是指满足查询条件的行数与总行数之间的比值,一个准确的估计,可以帮助优化器优化查询计划。

KingbaseES中通过表达式索引准确估计选择率

首先创建表t1,并插入数据,具体SQL如下所示:

create table t1 (c1 int);

对表进行ANALYZE之后,进行带有表达式条件过滤的SQL语句查询,使用的函数为MOD函数,具体如下:

analyze t1;
explain analyze select * from t1 where mod(c1, 3) = 1;
                                           QUERY PLAN
--------------------------------------------------------------------------------------------------
Seq Scan on t1  (cost=0.00..195.00 rows=50 width=4) (actual time=0.012..1.277 rows=3334 loops=1)
  Filter: (mod(c1, 3) = 1)
  Rows Removed by Filter: 6666
Planning Time: 0.082 ms
Execution Time: 1.381 ms
(5 rows)

从结果中可以看到,估计的行数为50行,而实际的行数为3334行,偏差高达60倍。可见,优化器对表达式的选择率估计有非常大的偏差。

接下来,在c1列上建立表达式索引,再次进行相同语句的查询,具体如下。

create index t1_idx1 on t1 (mod(c1, 3));
analyze t1;
explain analyze select * from t1 where mod(c1, 3) = 1;
                                                     QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on t1  (cost=70.12..165.13 rows=3334 width=4) (actual time=0.315..0.740 rows=3334 loops=1)
  Recheck Cond: (mod(c1, 3) = 1)
  Heap Blocks: exact=45
  -> Bitmap Index Scan on t1_idx1  (cost=0.00..69.29 rows=3334 width=0) (actual time=0.272..0.272 rows=3334 loops=1)
        Index Cond: (mod(c1, 3) = 1)
Planning Time: 0.170 ms
Execution Time: 0.850 ms
(7 rows)

可以看到,查询预计的函数与实际的行数都是3334行,选择率估计完全正确,没有偏差。通过建立表达式索引,修正了优化器选择率估计的偏差。

参考文档:

KingbaseES V8用户手册

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论