Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
Переливаю данные из одной БД в другую. В БД-источнике есть большая таблица (на 20млн записей)
Перенос будет еженедельный. Но пока нужны просто данные. Поэтому пишу скрипты прямо в
Management Studio на самом сервере (обе БД на нем же). Версия SQL Server 2008 R2.
Проблема состоит в том, что на каком-нибудь уже не первом часе работы скрипта вылетает System.ComponentModel.Win32Exception: Недостаточно памяти для обработки команды.
Значит ли это, что нужно реализовать порционную обработку строк таблицы-источника?
Какие есть способы? Расчетное время выполнения всей обработки 12-13 часов, если бы не нехватка памяти.
Может память как-то нужно тут освобождать?
DECLARE @CurID BIGINT
DECLARE @i BIGINT
SET @i=0

DECLARE cChild CURSOR LOCAL FAST_FORWARD
FOR 
SELECT Table1id FROM TableBind 

  OPEN cChild 
  FETCH cChild INTO @CurID 
         
  WHILE @@Fetch_Status = 0 
   BEGIN
   
    SET @i=@i+1; 
    
    with links as (
	select
		 t1.id
		,t1.pid
		,t1.typeid
		,t1.name as nm
	from
		Table1 t1 
	where 
		t1.id = @CurID
	union all
	select 
		 t1.id
		,t1.pid
		,t1.typeid
		,nm
	from 
		links 
	join 
		Table1 t1 on t1.id = links.pid 
	where t1.typeid>5			
	)
	INSERT INTO Table2(i,id,typeid,nm)
	select @i,id,typeid,nm
	from links
    option (maxrecursion 0);
     
    FETCH cChild INTO @CurID
                  
   END
  CLOSE cChild
12 фев 15, 10:13    [17253994]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
правильный проходящий.
Guest
anna.serg,

первое, что надо сделать - избавиться от курсора ибо тут он как собаке пятая нога.
12 фев 15, 10:17    [17254026]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
anna.serg
Может память как-то нужно тут освобождать?

Памяти не хватает вашей Management Studio
Потому что ваш скрипт продуцируент слишком много _выходной информации_, которую студия держит в памяти
Поставьте в начало скрипта SET NOCOUNT ON
12 фев 15, 10:19    [17254041]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
bald56rus
Member

Откуда:
Сообщений: 194
anna.serg,

я бы наверно попробовал делать это "порциями" выбрал из источника n записей, выполнил то что необходимо, выбрал следующие записи и так в цикле
12 фев 15, 10:19    [17254048]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
правильный проходящий., изначально да не было курсора.
но без него я не могу (п.ч.не знаю как) отследить, как идут дела.
а слежу по счетчику @i. и когда не было курсора тоже были проблемы с памятью.

Glory, спасибо буду знать!

bald56rus, вот да надо как-то порциями даже не случай потери коннекта.
возникает проблема понять, какие строки были обработаны, какие нет.
приходится искать разность множеств, что само по себе отнимает время.
12 фев 15, 12:26    [17254986]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
anna.serg
отследить, как идут дела.


Смотреть количество вставленных данных через Select с nolock?
12 фев 15, 13:49    [17255785]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
VGalamakh,да..
12 фев 15, 14:11    [17255960]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
первую порцию данных в 1млн записей получу так
SELECT top 1000000 Table1id FROM TableBind 

а как получить остальные порции?
а если произойдет вставка в таблицу TableBind, то где окажется эта новая запись?
к чему привязывается top?
Должен же быть какой-то наиболее грамотный ход разбить набор
12 фев 15, 14:29    [17256114]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
anna.serg
а как получить остальные порции?

Это не порция. Это миллион случайных записей.

anna.serg
к чему привязывается top?

Вот и подумайте на этим
12 фев 15, 14:31    [17256135]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
bald56rus
Member

Откуда:
Сообщений: 194
anna.serg
первую порцию данных в 1млн записей получу так
SELECT top 1000000 Table1id FROM TableBind 

а как получить остальные порции?
а если произойдет вставка в таблицу TableBind, то где окажется эта новая запись?
к чему привязывается top?
Должен же быть какой-то наиболее грамотный ход разбить набор


https://www.sql.ru/faq/faq_topic.aspx?fid=105 может тут посмотреть
12 фев 15, 14:33    [17256151]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
Glory,так я к тому и пишу. что это не способ
12 фев 15, 14:36    [17256198]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
anna.serg
Glory,так я к тому и пишу. что это не способ

Ну так определите способ деления на порции для своего конкретного случая.
Вы ждете, что за вас его придумают ? Потому что он один единственный в мире ?
12 фев 15, 14:38    [17256216]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
Glory
Вы ждете, что за вас его придумают ? Потому что он один единственный в мире ?

Glory, полегче. мой случай не какой-то особенный. и спрашиваю, полагая как раз-таки что способ не один, а что есть ряд стратегий. на которые я прошу натолкнуть. А НЕ СДЕЛАТЬ.

bald56rus, спасибо!
12 фев 15, 14:56    [17256354]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
anna.serg
Glory, полегче. мой случай не какой-то особенный. и спрашиваю, полагая как раз-таки что способ не один, а что есть ряд стратегий. на которые я прошу натолкнуть

Каких стратегий ?
Нужно выбрать порядок следований записей и критерии однозначного определения местоположенния каждой записи в этом порядке
12 фев 15, 14:59    [17256379]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
o-o
Guest
anna.serg,

так только вы знаете, что у вас в таблице.
вон какие-то id, pid, выберите, что там уникальное, к нему и привязывайтесь
12 фев 15, 15:00    [17256391]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
anna.serg
Member

Откуда: smolensk-spb
Сообщений: 122
Всем спасибо за рекомендации! буду выделять по диапазонам данных.
12 фев 15, 15:20    [17256537]     Ответить | Цитировать Сообщить модератору
 Re: Порционная обработка строк таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
anna.serg
Всем спасибо за рекомендации! буду выделять по диапазонам данных.


Вообще лучше всего выставить ROWVERSION в источнике и опираясь на него искать новые и изменившиеся записи. Выбирать порцию по возрастанию ROWVERSION и c помощью BULK INSERT вставлять на приемник. Лучше всего с этим справляется SSIS -> DataFlow .
12 фев 15, 16:26    [17257053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить