我在几台机器上做了一些工作。 需要为每台机器将行分成相等的部分。 查询所有条件执行很长时间。 在一个查询中,是否可以在没有额外请求计数(*)的情况下执行此操作。 有人喜欢这样:
select * from some_table
where some_rows = some_values
offset (count(*) / count_machines) * (machine_number - 1)
limit count(*) / count_machines
答案 0 :(得分:1)
我有时将数据拆分成块是一个简单的模数:
select * from some_table
where some_rows = some_values
and mod(id, BLOCKS) = BLOCK - 1;
将BLOCKS替换为机器数量,BLOCK用数字n从1替换为BLOCKS以检索块n。
(如果计算机的数量是静态的,你甚至可以使用模数表达式上的函数索引加快速度,你需要更频繁地使用它。)
答案 1 :(得分:0)
如果您希望每台计算机的行数相同,请使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by machine order by machine) as seqnum
from some_table t
where . . .
) t
where seqnum <= 10;
答案 2 :(得分:0)
不要重新发明轮子 在记录的值上使用散列函数,然后按机器的数量进行模数化,以获得将保存记录的机器。 如果您能够很好地选择价值,那么您将获得良好的分配,良好的表现,并且您将知道每条记录的位置。