Plsql 基于oracle表中的值创建偶数范围
我有一个10万行的大表,主键是数据类型编号。此列中填充数据的方式是使用随机数生成器 所以我的问题是,是否有可能使用SQL查询来帮助我使用值的范围对表进行均匀分区。例如:如果我的列值如下所示:Plsql 基于oracle表中的值创建偶数范围,plsql,oracle11g,partition,Plsql,Oracle11g,Partition,我有一个10万行的大表,主键是数据类型编号。此列中填充数据的方式是使用随机数生成器 所以我的问题是,是否有可能使用SQL查询来帮助我使用值的范围对表进行均匀分区。例如:如果我的列值如下所示: 1 2 3 4 5 6 7 8 9 10 Range 1 1-3 Range 2 4-7 Range 3 8-10 我希望将其分为三个分区,然后我希望得到如下输出: 1 2 3 4 5 6 7 8 9 10 Ra
1
2
3
4
5
6
7
8
9
10
Range 1 1-3
Range 2 4-7
Range 3 8-10
我希望将其分为三个分区,然后我希望得到如下输出:
1
2
3
4
5
6
7
8
9
10
Range 1 1-3
Range 2 4-7
Range 3 8-10
听起来您需要
WIDTH\u BUCKET()
函数
此查询将根据id
,为1250行的表提供开始和结束范围,该表分为20个存储桶:
with bkt as (
select id
, width_bucket(id, 1, 1251, 20) as id_bucket
from t23
)
select id_bucket
, min(id) as bkt_start
, max(id) as bkt_end
, count(*)
from bkt
group by id_bucket
order by 1
;
中间的两个参数指定最小值和最大值;最后一个参数指定存储桶的数量。输出是最小和最大船首之间的行,尽可能均匀地分割为指定数量的铲斗。注意最小和最大参数;我发现选择不当的边界可能会对分割产生奇怪的影响。此解决方案在没有
width\u bucket
函数的情况下有效。虽然它更加冗长,效率肯定更低,但它将尽可能均匀地分割数据,即使缺少一些ID值
CREATE TABLE t AS
SELECT rownum AS id
FROM dual
CONNECT BY level <= 10;
WITH
data AS (
SELECT id, rownum as row_num
FROM t
),
total AS (
SELECT count(*) AS total_rows
FROM data
),
parts AS (
SELECT rownum as part_no, total.total_rows, total.total_rows / 3 as part_rows
FROM dual, total
CONNECT BY level <= 3
),
bounds AS (
SELECT parts.part_no,
parts.total_rows,
parts.part_rows,
COALESCE(LAG(data.row_num) OVER (ORDER BY parts.part_no) + 1, 1) AS start_row_num,
data.row_num AS end_row_num
FROM data
JOIN parts
ON data.row_num = ROUND(parts.part_no * parts.part_rows, 0)
)
SELECT bounds.part_no, d1.ID AS start_id, d2.ID AS end_id
FROM bounds
JOIN data d1
ON d1.row_num = bounds.start_row_num
JOIN data d2
ON d2.row_num = bounds.end_row_num
ORDER BY bounds.part_no;
PART_NO START_ID END_ID
---------- ---------- ----------
1 1 3
2 4 7
3 8 10
将表t创建为
选择rownum作为id
来自双重
按级别连接您的意思是将表物理地重建为分区表,还是只需要一个将返回三组数据的查询mod(您的\u pk\u列,3)
将返回0、1或2,如果您只需要三分之一的数据。@WilliamRobertson:我不想将我的表重建为分区,但我想知道如何根据我选择的分区数来定义一个范围来打破表。我的意思是,如果我的表有100条记录,我想把它分成5个分区,我知道每个分区都有20条记录,但我真的想根据特定分区的列数据得到确切的起点和终点。组中的PK值是连续的,这重要吗,假设这些值是随机分配的?例如,mod(id,3)
将给出三个分组,分别为{3,6,9}
,{1,4,7,10}
,{2,5,8}
。是这样,还是必须是{1,2,3}
,{4,5,6}
等?非常感谢您的评论。这实际上很有帮助。如果我的PK列是varchar或GUID,您能告诉我如何转换上面的列吗?软件之所以如此神奇的原因之一是它允许我们进行实验。我们可以尝试一些东西,编写一些代码,看看会发生什么。最酷的是,无论发生什么,我们都学到了一些东西。实验只需要一些时间。