首页 > 编程知识 正文

大表查询优化,自定义柱形图的最大值最小值

时间:2023-05-06 11:23:35 阅读:20174 作者:4836

一、优化器分类

Oracle7和Oracle8有两种类型的优化程序:允许您导出SQL语句的执行计划

-基于规则的优化程序(RBO ) )。

使用从Oracle6继承的一组严格规则确定每个SQL语句的执行计划。 如果你知道这些规则

可以创建SQL查询以按指定方式访问数据。 表的内容不影响计划的执行。

此优化程序不再增强,因此无法使用许多oracle8特性。

-基于成本的优化程序(CBO ) )。

是从Oracle7引入的。 为了最大限度地提高吞吐量或初始响应时间,此优化程序正在寻找以最低成本访问数据的方法。

计算不同执行计划的成本,选择成本最低的一个。 有关表中数据内容的统计信息将用于确定执行计划。

基金点的基本点

每个SQL语句都有许多可执行的计划。 “最佳计划”无论达到多少,始终是“最佳计划”。

最佳方案有两层含义。

1此计划使用最小的资源来处理与语句相关的所有行。 称为ALL_ROWS]

2此计划将在最短时间内返回此语句的第一行。 称为FIRST_ROWS]

CBO不了解应用的相关特性,也不能完全理解相关表之间复杂关系的影响。 只有有限的信息可以用于确定最佳计划。

CBO计算各种执行方案的估计成本以确定最佳计划,并选择最低成本的计划。 因为这关系到相关成本的假设,

选定的计划不一定是真正最好的计划。 这经常作为错误报告给oracle技术支持,因为CBO没有为特定方案选择最佳计划。

二.直方图

从10g版开始,Oracle将自动收集Histogram。 Histogram是否收集取决于col_usage$中记录的将此列用作SQL谓词条件的信息和数据分布。

SMON会定期刷新col_usage$表中shared pool谓词的使用情况。

例如:

选择*从tab where cola=1;

对colA记录为equality _ preds-equality predicates等式谓词

二. CBO何时使用直方图

Oracle优化程序优化程序有两个使用Histogram:的位置

过滤谓词的选择性评估

连接基数(Cardinality )评估

评估连接基数(Cardinality )时,往往相差数千英里。

优化程序可能会选择错误的连接方法或顺序。

例如,页面排序查询由于基数评价的误差而使用了HASH JOIN… .

三.直方图bucket桶数

Histogram的备份桶数

大多数情况下,它总是适合默认的75桶

最大桶数=最小值(254,其他因素限制桶数) )。

在频繁发生的distinct值的数据不多的情况下,将桶的数量设定得比该数量大往往是有益的。

四.直方图分类

12c版以前有两种类型的Histogram

1、高平衡直方图

列值被拆分为多个buckets

每个bucket包含几乎相同数量的行数

对于NDV254,将采用高平衡直方图。 (请注意,由dbms_stats采样的NDV不一定是实际的NDV。 )

特点:

除了最后一桶之外,每个buckets桶的行数几乎相同

最后一桶可能比其他桶少

每个桶的最大值为bucket value endpoint_value

各值占水桶的一部分,呈比例

2、frequency histogram (基于值)频率直方图

此列中的每个值都有频率信息

在ndv(numberofdistinctvalues )个数=最大桶数buckets 254个的情况下使用频率直方图

特点:

每个bucket桶都表示列的值

列中的所有值都有对应的桶

NDV (被采样)时

density=1/(2*numrows*a4nulls ) ) ) ) ) ) ) ) )。

五.看

列的统计信息可以以柱状统计图的形式保存。 柱状统计图为列数据提供准确的描述信息。 特别是在数据列有倾斜的情况下,某个值的记录行数非常多,某个值的记录行数非常少。 Oracle包含两种类型的柱状统计图表:高度方形图表(height-balanced )和频率直方图(frequency histograms ),此类型为视图) tab_col_statistics

FREQUENCY或 NONE

(1)高度直方图高度直方图中,数据列的值被分成组,每组包含的数据数据可数基本相等。比如有一个列c其值在1到100之间,当均匀分布,其列的高度直方图如下图:

每个间隔中都包含数据列的10行数据;当不均匀分布时其列直方图如下图

这时,大多数数据行的值为5。查询时最有价值的统计信息就是各个组范围的两个端点的值.

查看统计信息的语法如下:

BEGIN

DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',

METHOD_OPT => 'FOR COLUMNS SIZE 6 SAL');

END;

/

SELECT column_name, num_distinct, num_buckets, histogram

FROM USER_TAB_COL_STATISTICS

WHERE table_name = 'EMP' AND column_name = 'SAL';

结果:

SELECT endpoint_number, endpoint_valueFROM USER_HISTOGRAMSWHERE table_name = 'EMP' and column_name = 'SAL'ORDER BY endpoint_number;结果:

上图中,每行对应高度直方图中的每个间隔。

(2)频率直方图在频率直方图中,列中每个唯一数据相当于高度直方图中的每个间隔,其高度对应该数据在列中出现的次数。当列中distinct值得个数小于或等于直方图的分格段的个数(即num_buckets的值)时,频率直方图会被自动建立。查看频率直方图的语法如下:

BEGIN

DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',

METHOD_OPT => 'FOR COLUMNS SIZE 12 SAL');

END;

SELECT column_name, num_distinct, num_buckets, histogram

FROM USER_TAB_COL_STATISTICS

WHERE table_name = 'EMP' AND column_name = 'SAL';

结果:

SELECT endpoint_number, endpoint_valueFROM USER_HISTOGRAMSWHERE table_name = 'EMP' and column_name = 'SAL'ORDER BY endpoint_number;结果:

整理的时候发现下面两篇文章也不错

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。