Performance 在Oracle 10中优化从分区事实表中选择

Performance 在Oracle 10中优化从分区事实表中选择,performance,oracle,partitioning,business-intelligence,Performance,Oracle,Partitioning,Business Intelligence,我有一个事实表,包含800万行,每月增加100万行。表上已包含索引。ibmcognos环境使用该表生成报告。目前我正在寻找优化表SELECT语句的方法 作为第一次尝试,我对表进行了分区(每个分区的行分布相同),并且查询适用于这些分区,但是由于某些原因,我的性能变得相同甚至更差,这很奇怪。每个查询只影响一个分区。有人能解释一下如何优化这个吗 我的第二个想法是将事实表实现为索引组织的表,但它必须将所有列作为主键。这样可以吗?会有性能提升吗 第三个想法是以包含从星型模式连接的所有列的方式实现事实表。会

我有一个事实表,包含800万行,每月增加100万行。表上已包含索引。ibmcognos环境使用该表生成报告。目前我正在寻找优化表SELECT语句的方法

作为第一次尝试,我对表进行了分区(每个分区的行分布相同),并且查询适用于这些分区,但是由于某些原因,我的性能变得相同甚至更差,这很奇怪。每个查询只影响一个分区。有人能解释一下如何优化这个吗

我的第二个想法是将事实表实现为索引组织的表,但它必须将所有列作为主键。这样可以吗?会有性能提升吗

第三个想法是以包含从星型模式连接的所有列的方式实现事实表。会有绩效提升吗

编辑:以下是执行计划:

在创建了包含分区条件的索引之后,我成功地将事实表FT_的访问时间成本减少了3倍(成本是42000,现在是14900),但在此之前,我得到的结果比未分区表中的结果更糟糕。我使用这个链接来解决分区问题


从我现在看到的情况来看,主要的瓶颈是该集团将成本从34000提高到85000,这是该集团的两倍多。有人知道如何解决这个问题吗?

分区修剪可能是一个棘手的问题

你对你的问题有解释计划吗?它是否显示分区范围单个?如果没有,那么查询将忽略分区。如果是这样的话,那么你还有其他问题

我的钱花在这些分支中的第一个上:物理上重新排序表。这意味着不符合分区策略的执行计划可能会比针对未分区表的执行计划运行得更糟糕

为了进一步了解这一点,我们需要了解一些细节。至少表的partitioning子句和查询中适合这种方法的部分。解释计划也会很有帮助。您给我们的细节越多越好:调优就是关于细节,因为每种情况都是独特的


“你能解释一下为什么 group by的成本如此之高,它是如何做到的 可以减少吗?”

通过排序进行分组。如果您有大量数据,这可能会很昂贵,因为它需要内存(或磁盘写入)和CPU周期


至于降低成本,对于一个我没有见过的问题,提供建议有点困难。我能说的是:查询需要时间,而使用大量数据的查询需要更长的时间。调优的秘密在于了解给定查询的合理时间长度。如果查询运行速度足够快,那么成本是不相关的

分区修剪可能是一个棘手的问题

你对你的问题有解释计划吗?它是否显示分区范围单个?如果没有,那么查询将忽略分区。如果是这样的话,那么你还有其他问题

我的钱花在这些分支中的第一个上:物理上重新排序表。这意味着不符合分区策略的执行计划可能会比针对未分区表的执行计划运行得更糟糕

为了进一步了解这一点,我们需要了解一些细节。至少表的partitioning子句和查询中适合这种方法的部分。解释计划也会很有帮助。您给我们的细节越多越好:调优就是关于细节,因为每种情况都是独特的


“你能解释一下为什么 group by的成本如此之高,它是如何做到的 可以减少吗?”

通过排序进行分组。如果您有大量数据,这可能会很昂贵,因为它需要内存(或磁盘写入)和CPU周期


至于降低成本,对于一个我没有见过的问题,提供建议有点困难。我能说的是:查询需要时间,而使用大量数据的查询需要更长的时间。调优的秘密在于了解给定查询的合理时间长度。如果查询运行速度足够快,那么成本是不相关的

分组依据实际上是什么


explain计划指示散列联接中的1238320行通过进入组,而顶层SELECT中出现相同的数字。这表明优化器实际上并不相信您会在这里进行任何真正的聚合。

分组实际是什么


explain计划指示散列联接中的1238320行通过进入组,而顶层SELECT中出现相同的数字。这表明优化器实际上并不相信您会在这里进行任何真正的聚合。

降低分组成本通常需要创建pe计算的聚合,通常是通过创建一个或多个物化视图。

降低分组成本通常需要创建pe计算的聚合,通常通过创建一个或多个物化视图。

如果在执行计划的末尾看到,则表明表FT_COSTS已完全访问(表访问已满)。因为它是完全被访问的,所以在您为获取刚刚添加的数据而进行的所有连接中,最终成本似乎很大。我的建议是为表设置适当的索引,以便它引用索引而不是整个表来访问数据,然后看到性能的巨大变化

如果您在执行计划的末尾看到,它显示表FT_COSTS已完全访问(表访问已满)。因为它是完全被访问的,所以在您为获取数据而进行的所有连接中,刚刚添加的数据最终会显示成本