分区对以下查询"Select * from Table_name"有什么影响



我已经在数据库上实现了数据库分区。分区是由DBMS_REDEFINITION完成的。我的问题是,当我们从表中执行select *语句时,分区是否会影响性能。

提示:我们选择的是一个表 的全部数据

select * from Non_Partitioned_tableselect * from Partitioned_table的区别是什么?

分区不太可能对select * from table_name;这样的查询有任何影响

关于分区的一个常见误解是,简单地将表划分为块可以提高性能。除非您正在利用特定的分区特性,如分区修剪或分区明智连接,否则最好让Oracle决定如何分配工作。例如,在并行处理中,Oracle可以很容易地将工作划分为块范围颗粒,而不是分区颗粒。

这可能不会影响性能

解析有一点额外的开销;更多的元数据需要收集和分析,更多的优化决策需要评估。在实践中,我从来没有注意到分区有什么显著的区别。在复杂的分区修剪决策中,我确实看到过一些不寻常的行为,但这与这个简单的语句无关。

有一些额外的数据要读取;更多的片段可能意味着更多的空间浪费。在实践中,使用默认值和正常数量的分区,这个额外的开销不是什么大问题。特别是对于延迟段创建,其中空分区占用0字节。虽然这个特性只适用于从11.2.0.2开始的分区。

但是在一些极端的例子中,会变得非常糟糕。例如,如果您设置了一个大而统一的区段大小,或者禁用了延迟段创建,或者创建了一个包含数千个分区的表,每个分区只有一行。在这种情况下,一个简单的select语句可能需要几分钟而不是几分之一秒。

在查询中没有"Where子句"之前,分区表和非分区表之间没有区别。分区将在你对表进行分区的条件下工作。例如,当您按日期对表进行分区时,where子句中所有具有日期条件的查询都会受到影响。

最新更新