sql: копирование в таблицу кусками? - PullRequest
0 голосов
/ 11 июня 2018

Моя задача заключается в том, что мне нужно создать индекс для большой таблицы в SQL Server (~ 370G).План состоит в том, чтобы

  1. создать новую таблицу с теми же столбцами и
  2. создать кластеризованный индекс в новой таблице на трех столбцах
  3. копировать небольшими порциями (сгруппированы по трем столбцам) исходные данные в новую таблицу.

Я могу сделать 1) и 2) в SQL с помощью следующего сценария:

SELECT TOP 0 *
INTO js_sample_indexed
FROM dbo.js_sample

CREATE CLUSTERED INDEX domain_event_platform_idx 
ON dbo.js_sample_indexed (domain ASC, event_type ASC, platform ASC)  
GO

Но я застрял в третьем шаге.Предположительно, в индексе есть тысячи значений, например, значение может быть («Amazon», «search», «mobile»).

Так что мне может понадобиться поместить оператор where в цикл for, одновременно обновляя условие для выбора.

Но я застрял в том, как хранить и извлекать значения в каждом столбце (например, «домен»), используя SQL.

Не знаю, ясно ли я сформулировал этот вопрос, но любые комментарии будут полезны.Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Так что я придумал ответ после некоторого чтения и вопроса.Вот код:

USE jumpshot_data
GO

DROP TABLE dbo.js_indexed

-- create a new table with existing structure
SELECT TOP 0 *
INTO dbo.js_full_indexed_1
FROM dbo.js_test

CREATE CLUSTERED INDEX domain_event_platform_idx 
ON dbo.js_full_indexed_1 (domain ASC, event_type ASC, platform ASC)  
GO

CREATE NONCLUSTERED INDEX device_id_idx 
ON js_full_indexed_1 (device_id ASC);

-- using cursor to loop through meta-data table, and insert by chunk into the new table
DECLARE @event_type varchar(50)
DECLARE @platform varchar(50)
DECLARE @domain varchar(50)

DECLARE SelectionCursor CURSOR LOCAL FOR 
SELECT * FROM dbo.js_index_info

OPEN SelectionCursor
FETCH NEXT FROM SelectionCursor into @event_type, @platform, @domain

WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- operation at each row
    INSERT INTO dbo.js_full_indexed_1 
    SELECT *
    FROM dbo.js_test
    WHERE event_type = @event_type AND domain = @domain AND platform = @platform

    -- loop condition
    FETCH NEXT FROM SelectionCursor into @event_type, @platform, @domain
END

CLOSE SelectionCursor
DEALLOCATE SelectionCursor
GO
0 голосов
/ 11 июня 2018

Я предполагаю, что в таблице есть какое-то поле идентификации (поле с последовательным номером, используемое в качестве индекса).Для этого примера я назову это поле ID.Если это так, тогда простая циклическая конструкция сделает то, что вам нужно.

DECLARE @MinID int, @MaxID int, @Step int = 10000  -- Move 10k records per loop

SELECT @MinID = MIN(ID), @MaxID = MAX(ID)
FROM MyTableToCopyFrom

While @@MinID <= @MaxID
BEGIN
    INSERT INTO MyTableToCopyTo (Field1, Field2, Field3, Fieldx)
    SELECT Field1, Field2, Field3, Field4
    FROM MyTableToCopyFrom 
    WHERE ID >= @MinId 
        AND ID < @MinId + @Step

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