偏移计数(*)/ N列

时间:2016-11-23 15:29:27

标签: sql postgresql

我在几台机器上做了一些工作。 需要为每台机器将行分成相等的部分。 查询所有条件执行很长时间。 在一个查询中,是否可以在没有额外请求计数(*)的情况下执行此操作。 有人喜欢这样:

select * from some_table
where some_rows = some_values
offset (count(*) / count_machines) * (machine_number - 1)
limit count(*) / count_machines

3 个答案:

答案 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)

不要重新发明轮子 在记录的值上使用散列函数,然后按机器的数量进行模数化,以获得将保存记录的机器。 如果您能够很好地选择价值,那么您将获得良好的分配,良好的表现,并且您将知道每条记录的位置。