Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-76054
mady
2002-12-24 23:50
2003.02.24
БЕЗ ПИВА НЕ ПИШЕТСЯ КАК СЧИТАТЬ ТРАФИК (ПОМОГИТЕ)


14-76089
Ketmar
2003-02-09 16:33
2003.02.24
постинг именинников


1-75936
td
2003-02-14 17:43
2003.02.24
как писать в текстовый файл?


1-75975
BOA_KAA
2003-02-12 17:12
2003.02.24
Отдельное окно


3-75828
Виталий Панасенко
2003-02-07 08:47
2003.02.24
IBCONFIG, YACONFIG





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский