2016-12-23 65 views
0

我有大量來自源的數據,每個記錄都有一個維度dim1。 Dim1可以有多達一百萬個唯一值。其中一些將有大量的數據,有些則會少一些。對於例如Dim1value1可能有100K條記錄,Dim1value2可能有100萬條記錄,Dim1value3可能有10條記錄等等。分區數據分成20個大致相等的SQL Server分區

現在我想將它們分組到一定程度相等的分區,以便與每個DIM1數據進入一個組,我要創建約20幾分等於組。

基本上每個記錄具有Dim1Value1應該進入一個組等。 這裏是顯示ntile如何不這樣做的腳本。

IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL 
    DROP TABLE #t 

CREATE TABLE #t 
(
    Dim1 varchar(100), 
    numberofrecs int 
) 

DECLARE @counter int = 1 

WHILE(@counter < = 100) 
BEGIN 
    INSERT #t 
     SELECT 
      'Dim1value' + CAST(@counter AS VARCHAR(10)), 
      CAST(RAND() * 100 AS INT) 

    SET @counter = @counter + 1 
END 

SELECT * FROM #t 

SELECT 
    NTILE(5) OVER(order by numberofrecs), 
    Dim1, * 
FROM #t 
+0

它是mysql還是sql-server?更新標籤並僅保留相關供應商。 – Dekel

+0

如果SQL Server考慮NTile()https://msdn.microsoft.com/en-us/library/ms175126.aspx –

+0

我不認爲ntile會這樣做。我考慮過它,但它只是將度量分類,然後將我的維度分成n組。基本上它會把所有具有最高數字的維度放在同一組中。這不是我想要的...這個SQL腳本將demonostrate它... –

回答

0

分割您DIM1最簡單的方法是:

SELECT ROWNUMBER()OVER(由numberofrecs順序)%20 + 1 AS PartNr, DIM1, * FROM #T ORDER BY 1

這IA不是一個完美的算法,它只會通過使用模函數記錄和僞分區數量排序接近的組。對於更好的算法,使用面向對象的邏輯而不是關係方法來實現CLR存儲過程是有意義的。另一種方法是讓ETL過程分析數據並選擇正確的分區。

我相信你誤解了分區的概念。儘管您應該爲分區選擇羣集,但試圖儘可能在分區上儘可能多地拆分數據,但分區數量在真實環境中並不是一個常數值。分區的全部目的是優化數據存儲,dml和查詢。你也可能想要實現一個滑動窗口,但這對您的方法來說確實很複雜且不直觀。 dim1中的數據是否已修復且不可更改?如果是這樣,你可以選擇你考慮的方法。如果沒有,您需要找到適合分區的索引。例如,一個日期值可能是一個候選人,並將這個日期分成幾周,幾個月或幾年左右。

+0

我做了類似的事情。我的問題是我幾乎總是從Dim1的一個值中查詢。我不想爲它分配多個分區。當我查詢Dim1的某個特定值時,我會查詢很多歷史記錄,因此按天或周分區是沒有意義的。如果我通過Dim1的值進行啞分區,例如Dim1value1到100的值爲1,值101到200的值爲2,依此類推,我將得到不相等的分區......如果將dim1value2與value200的值相加,則Dim1value1可能會有更多的記錄數... –