2016-11-23 91 views
1

我在幾臺機器上做了一些工作。 需要爲每臺機器將行分成相等部分。 查詢所有條件執行很長時間。 是否有可能在一個查詢中沒有附加請求數(*)的情況下執行此操作。 一些這樣的:補償計數(*)/ N列

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

你能提供的樣本數據和預期的效果?目前還不清楚你真正想做什麼。 「需要爲每臺機器劃分相同部分的行數」是什麼意思? –

+0

在表中計算行數= 100,並有4臺機器。第一臺機器必須得到1-25行,2:26-50,3:51-75,4:76-100 –

回答

1

我有時做數據分割成塊是一些ID的簡單模:

select * from some_table 
where some_rows = some_values 
and mod(id, BLOCKS) = BLOCK - 1; 

與機器的數量和BLOCK與多家替換塊N,從1到塊檢索塊n。

(你甚至可以在模式的函數索引加快這提供的計算機的數量是靜態的,你需要這個更頻繁。)

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; 
0

不要推倒重來。
在記錄的值上使用散列函數,然後用機器的數量來取模,以獲得將保存記錄的機器。 如果您將選擇好值,您將獲得良好的分佈,良好的性能,並且您會知道每條記錄的位置。