如何为分区列的不同值选择RDBMS数据

时间:2019-05-06 20:49:50

标签: sql oracle select database-partitioning

我有一个如下的Oracle表:

CREATE TABLE "TABLE1" 
(   
"TABLE_ID" VARCHAR2(32 BYTE), 
"TABLE_DATE" DATE, 
"TABLE_NAME" VARCHAR2(2 BYTE) 
)
PARTITION BY RANGE ("TABLE_DATE")

猜测该表的数据已按TABLE_DATE列进行分区。

如何使用此分区列在WHERE子句中从此表中更快地获取数据,如...

SELECT * FROM TABLE1 PARTITION (P1) p
WHERE p.TABLE_DATE > (SYSDATE - 90) ;

1 个答案:

答案 0 :(得分:0)

您应该更改分区以匹配查询,而不是更改查询以匹配分区。在大多数情况下,我们不必指定要读取的分区。 Oracle可以自动确定如何在运行时修剪分区。

例如,使用此表:

var comResClass = complileResults()

    class TestView: UIViewController, XMLParserDelegate {

        override func viewDidLoad() {
            super.viewDidLoad()
            comResClass.setConTypeResult(val: "WiFi")
            let ct = comResClass.getConTypeResult()
            print("CT ", ct)
        }
}

几乎不需要在查询中直接引用分区。这是额外的工作,如果我们列出了错误的分区名称,查询将无法正常工作。

我们可以看到使用create table table1 ( table_id varchar2(32 byte), table_date date, table_name varchar2(2 byte) ) partition by range (table_date) ( partition p1 values less than (date '2019-05-06'), partition p2 values less than (maxvalue) ); 进行分区修剪,如下所示:

EXPLAIN PLAN

在结果中,我们可以在explain plan for SELECT * FROM TABLE1 p WHERE p.TABLE_DATE > (SYSDATE - 90) ; select * from table(dbms_xplan.display); Pstart列中看到分区。 Pstop意味着将在运行时确定分区。在这种情况下,开始分区基于KEY的值。

SYSDATE