разделить таблицу сервера sql на куски - PullRequest
1 голос
/ 21 июля 2010

с использованием сервера sql 2008

Я хотел бы взять таблицу с 11 миллионами записей и разделить их на порции по 50000 при сохранении исходной таблицы и просто убедиться, что каждый блок содержит уникальные записи. Если я выберу первые 50000 записей для первой партии, как я могу гарантировать получение следующих 50000 записей и т. Д.

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Используйте функции ранжирования, в частности номер строки ():

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
3 голосов
/ 21 июля 2010

попробуйте NTILE (n), где n = количество кусков. Так как вам нужно создать таблицы «чанков», вы должны знать, сколько кусков вам нужно, и NTILE правильно разделит строки:

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

ВЫВОД:

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)
1 голос
/ 21 июля 2010

Я не уверен, почему вы хотите, но здесь идет -

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

Тогда вы бы увеличили свои 0 и 49,999 либо программно (надеюсь, если вы пройдете более 11 миллионов)записи) или вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...