我在pkey上有一个PK'tbl的tbl,并且具有以下分区DDL:
PRIMARY INDEX ( pkey )
PARTITION BY ( RANGE_N(STRT_DT BETWEEN '2014-12-31' AND '2020-12-31' EACH
INTERVAL '1' MONTH ,
NO RANGE),CASE_N( some_cd = 2, some_cd = 3 , some_cd = 11, ... some_cd=199 NO CASE) );
有32个some_cds,所以如果我选择一个特定的日期,我应该可以访问33个分区。那部分起作用。但是,如果我在一个月内完成日期范围设置,则可以得到66个部分。此外,如果我选择从月开始(09-01)到月末(09-30),则可以访问99个分区。我不确定为什么要把它们全部包含在一个月的部分中而应该只访问33时,为什么访问的部分是原来的两倍或三倍。
Explain SEL *
FROM db.tbl
WHERE strt_dt between '2018-09-02' and '2018-09-04';
1) First, we lock db.tbl for read on a reserved
RowHash in all partitions to prevent global deadlock.
2) Next, we lock db.tbl for read.
3) We do an all-AMPs RETRIEVE step from **66 partitions** of
db.evnt_tbl with a condition of (
"(db.tbl.STRT_DT <= DATE
'2018-09-04') AND (db.tbl.STRT_DT >=
DATE '2018-09-02')") into Spool 1 (group_amps), which is built
locally on the AMPs. The size of Spool 1 is estimated with no
confidence to be 15,582,768 rows (28,046,193,392 bytes). The
estimated time for this step is 43.56 seconds.
4) Finally, we send out an END TRANSACTION step to all AMPs involved
in processing the request.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 43.56 seconds.
答案 0 :(得分:0)
因为您将基于日期的RANGE_N分区定义为
STRT_DT BETWEEN '2014-12-31' AND '2020-12-31' EACH INTERVAL '1' MONTH
您的1 month
分区从该月的最后一天开始。因此,通过从表中选择一个月的记录,您实际上跨了两个分区(第二分区为66)。
这与EXPAND ON
子句中使用的逻辑类似,其中用于定义1 month
期间的日期范围是基于日期范围的开始日期的。
您可以通过在PARTITION
子句中添加SELECT
来查看此情况,以查看将每个记录拖到何处。
例如:
CREATE TABLE tmp (pkey INTEGER, somedate DATE)
PRIMARY INDEX (pkey)
PARTITION BY (RANGE_N(somedate BETWEEN DATE '2016-12-31' AND DATE '2017-12-31' EACH INTERVAL '1' MONTH));
INSERT INTO tmp SELECT ROW_NUMBER() OVER (ORDER BY calendar_date), calendar_date FROM Sys_Calendar.calendar WHERE calendar.calendar_date BETWEEN DATE '2016-12-31' AND DATE '2017-12-31';
SELECT tmp.*, PARTITION FROM tmp;
对于September
,您将看到跨越两个分区(在此示例中为9和10):
245 2017-09-01 9
246 2017-09-02 9
247 2017-09-03 9
248 2017-09-04 9
249 2017-09-05 9
250 2017-09-06 9
251 2017-09-07 9
252 2017-09-08 9
253 2017-09-09 9
254 2017-09-10 9
255 2017-09-11 9
256 2017-09-12 9
257 2017-09-13 9
258 2017-09-14 9
259 2017-09-15 9
260 2017-09-16 9
261 2017-09-17 9
262 2017-09-18 9
263 2017-09-19 9
264 2017-09-20 9
265 2017-09-21 9
266 2017-09-22 9
267 2017-09-23 9
268 2017-09-24 9
269 2017-09-25 9
270 2017-09-26 9
271 2017-09-27 9
272 2017-09-28 9
273 2017-09-29 9
274 2017-09-30 10
要解决此问题,请重新创建表并使用每月1号来定义分区范围的开始日期:
STRT_DT BETWEEN '2014-12-01' AND '2020-12-31' EACH INTERVAL '1' MONTH