KingbaseES创建多列统计信息
关键字:
优化器、统计信息、人大金仓、KingbaseES
一、摘要
本文首先介绍了数据库中多列统计信息的重要性,然后介绍了KES中创建多列统计的方法。
多列统计信息
数据库中,统计信息是关于表、索引和数据分布和特征的信息。数据库管理系统(DBMS)使用这些统计信息来优化查询执行计划,以提高查询性能。
多列统计信息是指关于多个列的联合分布和相关性的统计信息。提供了更全面的数据分析,使得数据库优化器能够更准确的评估查询的成本和选择最佳的执行计划。
假如有一个包含订单信息的表,包括订单ID、客户ID和订单日期等列。如果数据库中有多列统计信息,优化器可以更好的了解订单ID和客户ID之间的关联性。当执行查询时,如果查询条件中同时包含订单ID和客户ID,优化器可以根据多列统计信息来评估这两个条件的选择性,从而选择最佳的查询计划。如果没有多列统计信息,优化器可能会基于单列统计信息作出不准确的估计,导致选择了一个不够高效的执行计划。
因此,统计信息对于优化查询性能和选择最佳的执行计划非常重要,它提供了更全面的数据分析,帮助优化器更准确的评估查询条件的选择性和数据分布的相关性,从而提高查询性能。
KingbaseES中创建多列统计信息
KingbaseES中使用CREATE STATISTICS来创建多列统计信息。CREATE STATISTICS 将创建一个新的扩展统计对象,追踪指定表、外部表或物化视图的数据。该统计对象将在当前数据库中创建,被发出该命令的用户所有。
如果给定了模式名(比如, CREATE STATISTICS myschema.mystat ... ),那么在给定的模式中创建统计对象。否则在当前模式中创建。统计对象的名称必须与相同模式中的任何其他统计对象不同。语法如下:
CREATE STATISTICS [ IF NOT EXISTS ] statistics_name
[ ( statistics_kind [, ... ] ) ]
ON column_name, column_name [, ...]
FROM table_name
其中,IF NOT EXISTS表示如果具有相同名称的统计对象已经存在,不会抛出一个错误,只会发出一个提示。请注意,这里只考虑统计对象的名称,不考虑其定义细节。statistics_name表示要创建的统计对象的名称(可以有模式限定)。statistics_kind表示在此统计对象中计算的统计种类。目前支持的种类是启用ndistinct统计的ndistinct,以及启用功能依赖性统计的dependencies,MCV(Most Common Value)启用最常用的值列表。如果省略该子句,则统计对象中将包含所有支持的统计类型。column_name表示被计算的统计信息包含的表格列的名称。至少必须给出两个列名。列名的顺序无关紧要。table_name表示包含计算统计信息的列的表的名称(可以是模式限定的)。
KingbaseES中创建多列统计信息示例
下面是KingbaseES中创建多列统计信息示例。用两个功能相关的列创建表t1,即第一列中的值的信息足以确定另一列中的值。然后,在这些列上构建函数依赖关系统计信息:
CREATE TABLE t1 (
a int,
b int
);
INSERT INTO t1 SELECT i/100, i/500
FROM generate_series(1,1000000) s(i);
ANALYZE t1;
-- 匹配行的数量将被大大低估:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;
ANALYZE t1;
-- 现在行计数估计会更准确:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
如果没有函数依赖性统计信息,规划器会认为两个WHERE条件是独立的,并且会将它们的选择性乘以一起来返回满足条件的行,以致得到的行数被低估。通过这样的统计,规划器认识到WHERE条件是多余的,就不会低估行数。
创建具有两个完全相关的列的表t2(包含相同的数据),并在这些列上创建一个MCV列表:
CREATE TABLE t2 (
a int,
b int
);
INSERT INTO t2 SELECT mod(i,100), mod(i,100)
FROM generate_series(1,1000000) s(i);
CREATE STATISTICS s2 (mcv) ON a, b FROM t2;
ANALYZE t2;
-- valid combination (found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1);
-- invalid combination (not found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);
MCV列表为计划者提供了关于表中通常出现的特定值的更详细的信息,以及未出现在表中的值的组合的选择的上限,从而使它能够在两种情况下生成更好的估计值。