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

Откуда:
Сообщений: 360
Собственно задача простая. Есть много документов около 100 тык в день из внешней системы А со своими уникальными ID, нужно загружать их в систему B . К сожалению документы в системе A могут меняться и их необходимо будет перегружать, измененные документы будут приходить через шину. Т.е. на входе могут быть как новые документы, так и те которые грузились раньше, но измененные. Для скорости документы можно разделить на пакеты фиксированного размера (учитывая память) и обрабатывать параллельно, можно в пакете сразу понять какие документы изменены а какие новые .
Новые вставить скажем через Bulk Insert а измененные

Вопрос - какой наиболее эффективный способ Update для пакета из 10000 тыс записей например (размер пакета фиксированный), что бы при импорте совершать минимальное количество действий. Предположим что ID в разных заданиях не пересекаются

Хелп говорит что мы можем использовать переменную типа


DECLARE @Y table
запихнуть туда 10000 записей
далее сделать Update
UPDATE x -- cte is referenced by the alias.
SET Value = y.Value
FROM cte AS x -- cte is assigned an alias.
INNER JOIN @y AS y ON y.ID = x.ID;

Вроде все хорошо но хелп утверждает что
https://msdn.microsoft.com/ru-ru/library/ms175010.aspx
"ременные Table не имеют статистики распределения. Они не запускают повторных компиляций. Поэтому во многих случаях оптимизатор построит план запроса в предположении, что у табличной переменной нет строк. По этой причине следует проявлять осторожность относительно использования табличной переменной, если ожидается большое число строк (больше 100)"

"На переменных table нельзя создавать индексы и статистику. В некоторых случаях можно добиться повышения производительности за счет использования вместо табличных переменных временных таблиц, которые позволяют создавать индексы и вести статистический учет. "

Т.е. хелп толкает нас к использованию временных таблиц так как соединение без индекса это не очень хорошо
Однако временные таблицы TempDb
а) хранятся на диске б ) tempdb общий ресурс его используют разные задачи
Можно конечно его поместить в ОЗУ но так как это общий ресурс - ОЗУ может не хватить для других задач.

P S Я конечно могу эту задачу решить без update при импорте, храня не документы а их версии, но не хотелось бы усложнять структуру данных
29 сен 16, 13:18    [19723384]     Ответить | Цитировать Сообщить модератору
 Re: Update большого числа записей при импорте - выбор оптимального пути  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
selis76
Однако временные таблицы TempDb
а) хранятся на диске б ) tempdb общий ресурс его используют разные задачи
Открою страшную тайну - табличные переменные тоже таблицы и тоже хранятся в tempdb.
И индексы можно создавать (primary key, unique constraints).
И заставить оптимизатор учитывать кардинальность табличной переменной тоже можно: либо через option (recvompile), либо через TF 2453

В вашем конкретном случае, при размере порции в 10000 строк, и когда в целевой таблице строк много больше, наличие ПК на таблице-источнике, скорее всего, не повлияет на стратегию соединения таблиц.
А вот без ПК можно, например, получить взаимоблокировки, если загрузка будет в несколько потоков и диапазоны обрабатываемых строк в них пересекаются.
29 сен 16, 14:41    [19723920]     Ответить | Цитировать Сообщить модератору
 Re: Update большого числа записей при импорте - выбор оптимального пути  [new]
selis76
Member

Откуда:
Сообщений: 360
Так и хочется создать две tempdb - одна в памяти другая на диске.
Возможно ли это?
я помню когда клал сам Temp db в память создавал два файла данных один нерасширяемый в на виртуальном диске, другой расширяемый размером 1 мегабайт на HDD, если вдруг в памяти не хватало места происходило расширение TempDb на диске
29 сен 16, 16:08    [19724480]     Ответить | Цитировать Сообщить модератору
 Re: Update большого числа записей при импорте - выбор оптимального пути  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
selis76
Так и хочется создать две tempdb - одна в памяти другая на диске.
Возможно ли это?
я помню когда клал сам Temp db в память создавал два файла данных один нерасширяемый в на виртуальном диске, другой расширяемый размером 1 мегабайт на HDD, если вдруг в памяти не хватало места происходило расширение TempDb на диске


Механизмов распределения данных в файлах Tempdb нету, так что полагаться на это я бы не стал, там все будет от лукавого, а если уж нужны таблицы в памяти то в 2012+ они и так уже есть(In-Memory).
29 сен 16, 17:22    [19724852]     Ответить | Цитировать Сообщить модератору
 Re: Update большого числа записей при импорте - выбор оптимального пути  [new]
o-o
Guest
WarAnt
selis76
Так и хочется создать две tempdb - одна в памяти другая на диске.
Возможно ли это?
я помню когда клал сам Temp db в память создавал два файла данных один нерасширяемый в на виртуальном диске, другой расширяемый размером 1 мегабайт на HDD, если вдруг в памяти не хватало места происходило расширение TempDb на диске


Механизмов распределения данных в файлах Tempdb нету, так что полагаться на это я бы не стал, там все будет от лукавого, а если уж нужны таблицы в памяти то в 2012+ они и так уже есть(In-Memory).

Оптимистично, но безосновательно.
Inmemory начиная с 2014-ого, Enterprise Edition
29 сен 16, 20:09    [19725566]     Ответить | Цитировать Сообщить модератору
 Re: Update большого числа записей при импорте - выбор оптимального пути  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
selis76
Т.е. хелп толкает нас к использованию временных таблиц так как соединение без индекса это не очень хорошо
Там все равно будет полный скан временной таблицы, так что какие индексы?
29 сен 16, 23:43    [19726042]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить