2014-04-03 30 views
2

我创建了一个分区表作为如何有效地利用oracle数据库中的表分区?

CREATE TABLE orders_range(order_id NUMBER 
         ,client_id NUMBER 
         ,order_date DATE) 
    PARTITION BY RANGE(order_date) 
    (PARTITION orders2011 VALUES LESS THAN (to_date('1/1/2012','dd/mm/yyyy')) 
    ,PARTITION orders2012 VALUES LESS THAN (to_date('1/1/2013','dd/mm/yyyy')) 
    ,PARTITION orders2013 VALUES LESS THAN (MAXVALUE)); 

当我选择使用

SELECT * FROM ORDERS_RANGE partition(orders2011); 

记录说明计划的CPU成本是75 但是当我使用where子句中去普通查询cpu成本只有6,那么表现分区的优势是什么? 任何人都可以详细解释我吗?

在此先感谢。

+1

您可能想要指定使用哪个RDBMS。 – Vatev

+0

你使用哪些WHERE子句?桌上有没有索引? –

回答

1

首先,您通常不能直接比较针对两个不同对象运行的两个不同计划的cost。完全有可能一个成本为10,000的计划的运行速度比成本为10的另一个计划的运行速度快得多。您可以比较两个不同计划的cost在单个10053跟踪中的单个SQL语句(只要您记得这些是估计值,如果优化器估计错误,那么很多cost值都不正确,优化器可能会选择效率较低的计划)。如果您正在尝试计算优化程序在特定步骤中使用的算法,但是这非常不寻常,则可以比较两个不同查询之间的cost

其次,在你的例子中,你没有插入任何数据。一般来说,如果你打算对一个表进行分区,你这样做是因为你在这个表中有多个GB的数据。如果你比较像

SELECT * 
    FROM unpartitioned_table_with_1_billion_rows 

VS

SELECT * 
    FROM partitioned_table_with_1_billion_rows 
WHERE partition_key = date '2014-04-01' -- Restricts the data to only 10 million rows 

的分区方法将很明显,更高效并非最不重要的是,因为你只在4月1分区读10万行,而而不是表中的10亿行。

如果表中没有数据,那么可能针对分区表的查询效率稍低一点,因为在解析查询的过程中需要做更多的事情。但是,从0行表中读取0行几乎不会花费时间,因此解析时间的差异可能无关紧要。

通常,您不会使用ORDERS_RANGE partition(orders2011)语法来访问数据。除了对分区名称进行硬编码之外,这意味着你经常使用动态SQL来组装查询,你会做更多的解析,并且会给共享池带来更大的压力如果有人改变了桌子上的分区,你会冒险犯错。提供关于分区键的谓词以及让Oracle计算出如何适当修剪分区更有意义。换句话说,

SELECT * 
    FROM orders_range 
WHERE order_date < date '2012-01-01' 

将是一个更明智的查询。

+0

非常感谢Justin Cave为您提供明智的答案。 – user3493717