длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Доброго коллеги.
Не имел раньше дел с большими БД. Надо перенести данные из файлового представления в MSSQL. Не знаю нормально или нет если 1200 записей инсертится в БД 6 секунд? файл в 1200 строк парсится 50 мС а запись столько же в БД 6 сек кажется мне многовато. В инсерте 16 колонок 3 real, 3 char, 4 int, остальные varchar. инсертятся построчно, т.е. на одну запись один инсерт. В таблице сейчас под 150 миллионов записей. |
Re: длительность инсерта в таблицу | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Посмотри в сторону Bulk insert.
Быстрее способа нет. ------------------ Лень - это неосознанная мудрость. |
Re: длительность инсерта в таблицу | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
1. CHECKи. Например, контроль уникальности. Пока 150 млн записей не проверится на уникальность - никакого инсерта. Естественно CHECK с индексом быстрее;
2. TRIGGERы. То же самое, триггер выстреливает, возможно что-то распихивает по таблицам, те в свою очередь тоже попадают на CHECKи; 3. Обновление индексов. Немного, но время подъедает. |
Re: длительность инсерта в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
1. Определение таблицы куда идёт Insert, приведи.
2. Плюс реальный план в xml-виде. 3. Но скорее всего надо обновить статистику. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 1 раз(а). Последнее : PaulWist, 31.03.21 13:59 |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Таблица простая. Тригеров нет. Индекс по полю ID. Уникальность не проверяется.
[attachment 35203 TD1.zip] |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Я правильно понял что Bulk insert только из файла данных может делатся? Т.е. мне надо данные снова выгрузить в текстовый файл и потом уже из него делать Bulk insert? Выгружать получается лучше на сервер на котором крутиться MSSQL? |
Re: длительность инсерта в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
1. План TRIVIAL, те вставка быстрее не будет.
2. Выложи таблицу и индекс как Create. 3. ID - это автоинкриментное поле? ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: длительность инсерта в таблицу | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Уникальность проверяется. Вставка в примере идёт с указанием ID. Из плана я не совсем понял, подобрался индекс или нет, но статистику для такого случая обновить следует. |
Re: длительность инсерта в таблицу | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Да. Из csv или собственного bulk-формата. Цитата:Да. Цитата:Да. В любом случае перед вставкой все индексы желательно отключать и обратно включать уже после вставки. ------------------ Лень - это неосознанная мудрость. |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
|
Re: длительность инсерта в таблицу | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если таблица создаётся под загрузку (а не дополняется), то чуть-чуть ускорит процесс если индекс НЕ создавать заранее, а создать после загрузки. Конечно же тогда контроль уникальности данных уж целиком на твоей стороне будет.
bulk операции как раз и предназначены для сценариев массовой загрузки. "обычные" Insert, тем более одиночные, по определению будут медленнее. ------------------ WBR, Igor |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Проверяется чтобы было значение. Уникальность нет. |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Таблица уже в использовании. Паралельно ведется загрузка в ретроспективе. Наверно будет быстрее грузить ретроспективу в отдельную таблицу (может даже на другой сервер) а потом объединять по частям.(?) Контроль данных производиться программно перед инсертом. Исправлено 2 раз(а). Последнее : _vit, 01.04.21 14:16 |
Re: длительность инсерта в таблицу | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, staging таблицы это, не побоюсь этого слова, ключевая часть ETL процессов. "сырые" данные туда помещаем без валидаций и прочего, потом либо в другое временное место перегоняем, либо, если уже и так достаточно "хорошо", в собственно конечное хранилище. Надо глянуть в доке MSSQL, там вероятно есть опции для оптимизации такого рода "массовых перегонов данных", если скорости просто insert ... select ... будет недостаточно. ------------------ WBR, Igor |
Re: длительность инсерта в таблицу | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
Я не точно выразился, ID при вставке монотонно возрастает-убывает или же ID принимает значения от 1 до 150 млн? Я перегонял так, 1. Ручная транзакция 2. Перегон данных (обычно во временную таблицу - потом merge) 3. Commit те получаешь одну транзакцию, а не 1200 шт. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 1 раз(а). Последнее : PaulWist, 01.04.21 16:02 |
Re: длительность инсерта в таблицу | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
Если количество новых записей существенно больше уже существующих, то использовал такой прием 1. Создается новая таблица куда заливаются новые данные 2. Из используемой таблицы все существующие записи также копируются в эту новую таблицу 3. Старая таблица удаляется (или переименовывается) 4. Новая таблица переименовывается в используемую таблицу С другой стороны, если Вы просто архив загружаете, то чего торопиться-то? Грузите порциями, скажем, по 100 тысяч записей. Пусть неделю займет, и что? Архив же... Тут, кстати, таблица в той же базе будет удобнее. Можно будет при заливке очередной порции проверять, что повторно ранее загруженные записи не заливаются Да. Отключение индекса на время загрузки и пересоздание индекса после загрузки несколько ускоряет процесс. Не сильно, но несколько процентов так можно выиграть. Катастрофически тормозит загрузку кластерный индекс. Но у Вас его нет, а обычные индексы - не особо сильно влияют... |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
ВАУ! С использованием транзакции скорость увеличилась почти на порядок! Спасибо! Ты настоящий друг! А попозже попробую Bulk insert если админы разрешат класть файлы на сервер БД. Лена или Сергей подправте пожалуйста карму PaulWist это я промахнулся. |
Re: длительность инсерта в таблицу | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
Хм... А ты откуда грузишь ? Я подумал из файла... |
Re: длительность инсерта в таблицу | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Не обязательно на сервер. В место, доступное серверу. ------------------ Лень - это неосознанная мудрость. |
Re: длительность инсерта в таблицу | |
---|---|
_vit Автор Сообщений: 5175 Дата регистрации: 29.07.2002 |
Изначально данные находяться в файлах но их структура гетерогенна, поэтому их вначале надо гомогенизировать. После обработки парсером, данные находяться в памяти в виде унифицированной структуры откуда непосредствено и записываются в БД. |
© 2000-2024 Fox Club  |