Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
ВнизМассовый INSERT Найти похожие ветки
← →
FreeLancer (2003-02-06 18:18) [0]Какой способ массового INSERT вам видится наиболее быстрым:
1. Набор данных открыт SELECT"ом в TQuery, выполняются методы INSERT, POST, ApplyUpdates
2. Запрос в TQuery вида: INSERT INTO(...) VALUES(:params), заполнение параметров в цикле и вызов ExecSQL
3. Другой
Исходные данные берутся из строк текстового файла, значения разделены ";" типа:
234324;0;011;2879364876324
← →
ermserg (2003-02-06 18:25) [1]3
← →
MsGuns (2003-02-06 18:36) [2]1. INSERT INTO ... SELECT ... FROM
2. INSERT INTO ... VALUES ... в цикле
3. TDataSet.Insert/Post/ApplyUpdates
В порядке увеличения времени на выполнение. Хотя если 2) делать на сервере, то тоже самое, что 1)
← →
Sergey Masloff (2003-02-06 21:49) [3]В твоем случае external table спасет отца русской демократии. Подробности в документации.
← →
DarkGreen (2003-02-07 05:35) [4]2 MsGuns © (06.02.03 18:36)
Думается на второе место стоит поставить SP
2 Sergey Masloff (06.02.03 21:49)
В нее же только добавлять данные и селектить их можно, иль я не прав?
← →
Sergey Masloff (2003-02-07 07:31) [5]DarkGreen ©
>В нее же только добавлять данные и селектить их можно, иль я не прав?
Ну так быстрее INSERT INTO... SELECT... быстрее еще не придумали ;-)
← →
Alex Konshin (2003-02-07 08:12) [6]А, что, в интербейзе нет что-то типа bulkcopy?
Не, я действительно не знаю - я с ним не работал.
← →
DarkGreen (2003-02-07 08:31) [7]2 Alex Konshin © (07.02.03 08:12)
А что такое bulkcopy?
2 Sergey Masloff (07.02.03 07:31)
Согласен с вами, но я имел ввиду external table, если данные потребуется менять или удалять, она не подойдет
← →
Alex Konshin (2003-02-07 08:37) [8]Например, в MSSQL есть специальный механизм для массовых вставок, называется bulkcopy. Неужели в IB такого нет? Было бы очень странно...
← →
DarkGreen (2003-02-07 09:50) [9]Хм... А что мешает просто выполнять вставки? Просто не забывай COMMIT делать после 200-300 записей.
← →
FreeLancer (2003-02-07 11:55) [10]Спасибо всем за ответы, отдельно Sergey Masloff и MsGuns © за то, что вникли в вопрос :-).
Согласен с Вашей оценкой быстродействия, не пробовал еще, правда, external tables.
Вопрос возник по причине того, что отдельные коллеги меня убеждают в дикой скорости, получаемой с использованием ClientDataset. Есть здесь кто-нибудь, кто может подтвердить сей факт, исходя из условий задачи?
← →
Карелин Артем (2003-02-07 12:01) [11]А у меня вставка миллиона записей с 2-мя активными индексами идет полчаса. Вставляю исключительно через хранимую процедуру.
← →
MsGuns (2003-02-07 12:04) [12]Так это ж понятно, т.к. он работает с локальным диском, перебрасывая на сервер изменения сразу пачками. Ему не надо каждый раз за единичным изменением таблицы "проситься" к серверу.
Хотя опять же с клиентским датасетом можно работать по-разному.
← →
DarkGreen (2003-02-07 12:24) [13]2 Карелин Артем © (07.02.03 12:01)
Хм... Круто. У меня 20000 вставляются где-то за 45 секунд. Т.е. чуть помедленней чем у тебя, хотя тоже использую только SP. Что у тебя за сервер, сеть и клиент?
У меня сервер П3-900 512Мб диск IDE"шный 20Гб, сеть 100Мб, клиент П4-1400
← →
Карелин Артем (2003-02-07 12:43) [14]Ну а у меня сервер и клиент в одном стакане на OS Win2000"server.
Диск быстрый и памяти много.
Ну а данные: 3 строки (guid загонял)+ первичный ключ.
← →
DarkGreen (2003-02-07 13:04) [15]Хм... Тогда возможно из-за того, что на локале и тачка крутая быстрее. Даи инфы у меня малость побольше, к тому же одновременно текстовый файл парсится.
← →
Карелин Артем (2003-02-07 13:40) [16]В тесте ничего кроме генерации GUID и вставки его в ХП не проводилось.
Скорость вставки можно повысить так:
1) Индексы делать уникальные (или отключить нахрен). Неуникальные тормозят.
2) Размер страницы сделать 8 кило. (вроде FB 16 позволяет ?)).
3) В цикле делаем Application.ProcessMessages через несколько тысяч записей. Или не делаем вообще.
4) На ForcedWrites запись гораздо быстрее. Но не советую оставлять включенным надолго.
5) Скорость проца и память(??) почти не влияют. Только винт рулит.
6) Стартуем транзакцию при начале цикла. Заканчиваем по окончании всех вставок. (Ну это надеюсь все знают).
7) Делаем побольше кэш в FB(IB).
P.S. По конфигурации FB(IB) можно глянуть на Ibase.ru
← →
DarkGreen (2003-02-07 15:21) [17]1. FB позволяет 16кб
2. ForcedWrites лучше отключать, тогда будет кэш использоваться (не будет сквозной записи на диск и как следсвие будет быстрее)
3. Не рекомендуется делать большие транзакции, лучше комиттить через хотя бы 1000 записей
4. С остальным согласен
ЗЫ: На ibase.ru я постоянно бываю ;-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c