Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL分区范围全部,而不是单一范围_Sql_Oracle_Query Optimization_Database Partitioning - Fatal编程技术网

Oracle SQL分区范围全部,而不是单一范围

Oracle SQL分区范围全部,而不是单一范围,sql,oracle,query-optimization,database-partitioning,Sql,Oracle,Query Optimization,Database Partitioning,我按日期创建了一个分区表,当客户创建一个帐户时,我将createdate分开 CREATE TABLE PARTITIONED_customer ( customerId number(10) GENERATED AS IDENTITY, firstName varchar2(50), lastName varchar2(50),

我按日期创建了一个分区表,当客户创建一个帐户时,我将createdate分开

CREATE TABLE PARTITIONED_customer (
                        customerId number(10) GENERATED AS IDENTITY, 
                        firstName  varchar2(50), 
                        lastName   varchar2(50), 
                        email      varchar2(50), 
                        createDate date, 
                        active     char(1),
                        PRIMARY KEY (customerId))
                        PARTITION BY RANGE (createDate)
                        INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
                        (PARTITION first_quater_2018 VALUES LESS THAN(TO_DATE('01-04-2018','dd-MM-yyyy')),
                        PARTITION second_quater_2018 VALUES LESS THAN(TO_DATE('01-07-2018','dd-MM-yyyy')),
                        PARTITION third_quater_2018 VALUES LESS THAN(TO_DATE('01-10-2018','dd-MM-yyyy')),
                        PARTITION fourth_quater_2018 VALUES LESS THAN(TO_DATE('01-01-2019','dd-MM-yyyy')),
                        PARTITION first_quater_2019 VALUES LESS THAN(TO_DATE('01-04-2019','dd-MM-yyyy')),
                        PARTITION second_quater_2019 VALUES LESS THAN(TO_DATE('01-07-2019','dd-MM-yyyy')),
                        PARTITION third_quater_2019 VALUES LESS THAN(TO_DATE('01-10-2019','dd-MM-yyyy')),
                        PARTITION fourth_quater_2019 VALUES LESS THAN(TO_DATE('01-01-2020','dd-MM-yyyy')));
下面是我想知道客户何时创建帐户的SQL查询。我知道这个问题并不完全正确,对此我深表歉意

select c.createdate, c.firstname, c.lastname, round(sum(p.amount)) as spentmoney
from PARTITIONED_customer c
join PARTITIONED_rental r
on c.customerid = r.customerid
join PARTITIONED_payment_amount p
on p.rentalid = r.rentalid
where  c.createdate BETWEEN TO_DATE('01-05-2019','dd-MM-yyyy') 
AND TO_DATE('01-06-2019','dd-MM-yyyy') 
or (select round(sum(pp.amount)) from PARTITIONED_payment_amount pp
        join PARTITIONED_rental rr
        on rr.rentalid = pp.rentalid
        where rr.customerid=c.customerid) < 50 
group by c.firstname, c.lastname,c.createdate
order by c.firstname, c.lastname;
Explainer显示分区范围all,而不是single。怎么能修好呢


我用一个简单的查询检查了分区本身,结果很好。因此,我认为查询本身有问题。

您的查询正在对分区客户执行完全表访问,因此它当然必须搜索所有分区。我建议在分区键上创建索引:

CREATE INDEX PARTITIONED_CUSTOMER_1
  ON PARTITIONED_CUSTOMER (CREATEDATE)
  LOCAL;
如果确实需要,可以在查询中指定一个PARTITION子句:

select c.createdate, c.firstname, c.lastname, round(sum(p.amount)) as spentmoney
  from PARTITIONED_customer PARTITION (second_quater_2019) c
  INNER join PARTITIONED_rental r
    on c.customerid = r.customerid
  INNER join PARTITIONED_payment_amount p
    on p.rentalid = r.rentalid
  where  c.createdate BETWEEN TO_DATE('01-05-2019','dd-MM-yyyy') AND 
         TO_DATE('01-06-2019','dd-MM-yyyy') or
         (select round(sum(pp.amount))
            from PARTITIONED_payment_amount pp
            INNER join PARTITIONED_rental rr
              on rr.rentalid = pp.rentalid
            where rr.customerid=c.customerid) < 50 
  group by c.firstname, c.lastname,c.createdate
  order by c.firstname, c.lastname
还是你的意思

         (c.createdate BETWEEN TO_DATE('01-05-2019','dd-MM-yyyy') AND 
          TO_DATE('01-06-2019','dd-MM-yyyy')) or
         (select round(sum(pp.amount))
            from PARTITIONED_payment_amount pp
            INNER join PARTITIONED_rental rr
              on rr.rentalid = pp.rentalid
            where rr.customerid=c.customerid) < 50
         c.createdate BETWEEN TO_DATE('01-05-2019','dd-MM-yyyy') AND 
         (TO_DATE('01-06-2019','dd-MM-yyyy') or
          (select round(sum(pp.amount))
             from PARTITIONED_payment_amount pp
             INNER join PARTITIONED_rental rr
               on rr.rentalid = pp.rentalid
             where rr.customerid=c.customerid) < 50)
如果混合使用AND或类似的方法,最好使用括号将操作分组,否则可能无法得到预期的结果