Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

Массовый 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
3-75840
SasaR
2003-02-07 10:32
2003.02.24
Теоретический совет хочу...


1-75937
Kolius
2003-02-14 17:40
2003.02.24
алгоритм Безье


1-75890
Ciber SLasH
2003-02-14 02:39
2003.02.24
Как переключиться на другое окно?


1-76016
edicon
2003-02-13 00:40
2003.02.24
ComboBox


1-75932
Mad Diger
2003-02-14 17:04
2003.02.24
Шифрование файлов.