Я пытаюсь выполнить операцию по созданию пользовательской сети на основе записей сведений о вызовах в моей таблице CDR.
Для простоты скажем, у меня есть таблица CDR:
CDRid
UserAId
UserBId
есть более 100 миллионов записей, поэтому таблица довольно большая.
Я установил таблицу user2user:
UserAId
UserBId
NumberOfConnections
затем, используя curos, я перебираю каждую строку в таблице, затем делаю оператор выбора:
если в таблице user2user есть запись с UserAId = UserAId из записи CDR и UserBId = UserBId из записи CDR, то увеличьте NumberOfConnections.
в противном случае вставить такую строку, которая NumebrOfConnections = 1.
Довольно простая задача, и она работает, как я сказал, используя курсор, но она очень плоха по производительности (примерное время на моем компьютере ~ 60 часов).
Я слышал о Sql Server Integration Services, что он имеет более высокую производительность, когда речь идет о таких больших таблицах.
Проблема в том, что я понятия не имею, как настроить пакет служб SSIS для создания такой задачи.
Если кто-нибудь знает, как мне помочь, какие-нибудь хорошие ресурсы и т. Д., Я был бы очень благодарен.
Может быть, есть другое хорошее решение, чтобы оно работало быстрее. Я использовал индексы и таблицы переменных и т. Д., А производительность по-прежнему чиста.
спасибо за помощь,
приписка
Это сценарий, который я написал, и его выполнение занимает примерно 40 - 50 часов.
DECLARE CDR_cursor CURSOR FOR
SELECT CDRId, SubscriberAId, BNumber
FROM dbo.CDR
OPEN CDR_cursor;
FETCH NEXT FROM CDR_cursor
INTO @CdrId, @SubscriberAId, @BNumber;
WHILE @@FETCH_STATUS = 0
BEGIN
- здесь я проверяю, есть ли пользователь с этим номером (потому что в CDR у меня есть только SubscriberAId - и BNumber, так что мне нужно проверить, какой это пользователь (у меня есть только пользователи из
--network, чтобы каждый раз, когда я не мог найти этого пользователя, я добавлял одного, который является сетью outtide)
SELECT @UserBId = (Select UserID from dbo.Number where Number = @BNumber)
IF (@UserBId is NULL)
BEGIN
INSERT INTO dbo.[User] (ID, Marked, InNetwork)
VALUES (@OutUserId, 0, 0);
INSERT into dbo.[Number](Number, UserId) values (@BNumber, @OutUserId);
INSERT INTO dbo.User2User
VALUES (@SubscriberAId, @OutUserId, 1)
SET @OutUserId = @OutUserId - 1;
END
else
BEGIN
UPDATE dbo.User2User
SET NumberOfConnections = NumberOfConnections + 1
WHERE User1ID = @SubscriberAId AND User2ID = @UserBId
-- Insert the row if the UPDATE statement failed.
if(@@ROWCOUNT = 0)
BEGIN
INSERT INTO dbo.User2User
VALUES (@SubscriberAId, @UserBId, 1)
END
END
SET @Counter = @Counter + 1;
if((@Counter % 100000) = 0)
BEGIN
PRINT Cast (@Counter as NVarchar(12));
END
FETCH NEXT FROM CDR_cursor
INTO @CdrId, @SubscriberAId, @BNumber;
END
CLOSE CDR_cursor;
DEALLOCATE CDR_cursor;