2010-07-21 6 views
2

utilisant le serveur sql 2008diviser table serveur sql morceaux int

Je voudrais prendre une table qui a 11 millions de disques et les diviser en morceaux de 50000 chaque tout en maintenant la table originale et juste faire que chaque morceau contient unique, enregistrements. Si je sélectionne les premiers 50000 enregistrements pour le premier lot, comment puis-je garantir que je reçois le 50000 suivant et ainsi de suite.

+1

Est-ce que la table source avoir des colonnes qui peuvent être utilisées pour trier les données dans un ordre cohérent/reproductible? En fait - pourriez-vous éditer votre question pour montrer le schéma de la table? –

+0

Ne ferait pas n'importe quelle requête est nécessaire, avec un ordre par et puis ajouter «LIMIT 0,50000» à la première «exécution», «LIMIT 50000, 50000» à la seconde, et ainsi de suite, faire l'affaire? –

Répondre

4

Utilisation des fonctions de classement, dans la rangée numéro d'ordre particulier():

DECLARE 
    @From int 
,@Thru int 

-- Example here would be the second set 
SET @From = 50001 
SET @Thru = 100000 

SELECT <columns> 
from (select <columns>, row_number() over (order by <PrimaryKey>) Ranking 
     from MyTable) xx 
where Ranking between @From and @Thru 
1

Je ne sais pas pourquoi vous voudriez, mais ici GOES

SELECT * FROM 
( 
SELECT *, ROW_NUMBER() OVER (ORDER BY yourKey) AS Num FROM YourTable 
) X WHERE x.Num BETWEEN 0 AND 49999 

Ensuite, vous incrémenter votre 0 et 49999 par programme (espérons-le, si vous allez plus de 11 millions ce records), ou manuellement.

+0

"Je ne sais pas pourquoi vous voudriez" Je suis d'accord que cela me semble une chose étrange à faire aussi. – HLGEM

+0

J'ai fait des trucs comme ça quand j'ai (rarement!) Besoin de mettre à jour une très très grosse table et que je ne voulais pas inonder mon journal de transactions. –

3

essaient NTILE (n), où n = nombre de morceaux. Puisque vous devez créer les « gros morceau » tables, vous devez savoir combien de morceaux dont vous avez besoin, et NTILE divisera les lignes correctement pour vous:

DECLARE @YourTable table (RowID int, RowValue varchar(5)) 
INSERT @YourTable VALUES (1,'A') 
INSERT @YourTable VALUES (2,'B') 
INSERT @YourTable VALUES (3,'C') 
INSERT @YourTable VALUES (4,'D') 
INSERT @YourTable VALUES (5,'E') 
INSERT @YourTable VALUES (6,'F') 
INSERT @YourTable VALUES (7,'G') 
INSERT @YourTable VALUES (8,'H') 
INSERT @YourTable VALUES (9,'I') 
INSERT @YourTable VALUES (10,'J') 
INSERT @YourTable VALUES (11,'K') 
INSERT @YourTable VALUES (12,'L') 

DECLARE @YourTable1 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable2 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable3 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable4 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable5 table (RowID int, RowValue varchar(5)) 

INSERT @YourTable1 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=1 


INSERT @YourTable2 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=2 

INSERT @YourTable3 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=3 


INSERT @YourTable4 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=4 


INSERT @YourTable5 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=5 

SELECT * FROM @YourTable1 
SELECT * FROM @YourTable2 
SELECT * FROM @YourTable3 
SELECT * FROM @YourTable4 
SELECT * FROM @YourTable5 

SORTIE:

RowID  RowValue 
----------- -------- 
1   A 
2   B 
3   C 

(3 row(s) affected) 

RowID  RowValue 
----------- -------- 
4   D 
5   E 
6   F 

(3 row(s) affected) 

RowID  RowValue 
----------- -------- 
7   G 
8   H 

(2 row(s) affected) 

RowID  RowValue 
----------- -------- 
9   I 
10   J 

(2 row(s) affected) 

RowID  RowValue 
----------- -------- 
11   K 
12   L 

(2 row(s) affected) 
Questions connexes