|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
При добавлении большого числа записей в таблицу для сравниния использую вставку через рекордсет и через Execute("INSERT..."). Почему во втором случае все работает в несколько раз медленнее. Добавляется примерно миллион записей. Так и должно быть? Или это от того, что вставляется INSERTом по одной записи в цикле? Но чере рекордсет-то тоже в цикле. Непонятно! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2002, 23:55 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
Вообще insert'ом быстрее, но миллион записей за раз - это сильно. советую разбить на 5-10 инсертов, тогда все будет летать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2002, 09:08 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
не я перепутал, не миллион записей, а в миллион итерации, и не при каждой вставляется запись. вставок будет на порядок меньше. дело в том что не несколько записей одним инсертом, а несколькими инсертами по одной записи, т.е. инсерт в цикле. почему с инсертом медленне получается? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2002, 18:35 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
Так как ты написал, он должен каждый INSERT парсить (миллион итераций * кол-во инсертов в каждом) - прикинь, сколько идёт парсингов! Ёпрст, конечно при этом рекордсет быстрей! Потом, где база? если MSJet - то рекордсет ему родной, а INSERT штука чужеродная. Если на SQL-сервере, то такое надо делать хранимой процедурой, или batch-процессингом, или DTS - если MSSQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2002, 06:24 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
4 Роман Ткачук да это просто эксперимент >INSERT штука чужеродная почему же? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2002, 01:27 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
>>если MSJet - то рекордсет ему родной, а INSERT штука чужеродная Я имел здесь в виду доступ к локальным MDB-таблицам. Потому как когда даёшь ему строку символов "INSERT ляляля ..." он должен это отпарсить, т.е. перевести в цепочку API вызовов, тогда как объекты DAO (коим Recordset является) - всего лишь красивая обертка этих API-вызовов. Изначально, если не ошибаюсь, в персональных СУБД (DBase, Paradox, Access, Clipper, Clarion, etc... etc...) - поддержки SQL не было, а работа с таблицами осуществлялась через вызовы API собственного движка. Напротив, SQL-сервер работает с клиентом только через строки запросов, и парсить их эффективно - его первейшая задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2002, 06:35 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
4 Роман Ткачук слова >локальным MDB-таблицам в данном контексте принципиальны? не ужели, чтобы отпарсить нужно столько времени с INSERT примерно в 10 раз медленне работает! а разве Execute - это не метод объекта DAO? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 01:15 |
|
как лучше добавлять: INSERTом или через рекордсет?
|
|||
---|---|---|---|
#18+
>слова >>локальным MDB-таблицам >в данном контексте принципиальны? Мне казалось, я понятно написал... Ключевой момент: для доступа к локальным таблицам используются функции API движка (в случае Access движок MSJet, в Delphi это BDE, т.п.), в которых непосредственно происходит работа с источником. Скажем, MoveLast - вот такая функция. Набор из AddNew, Update - вызывают непосредственно функции API движка, ковыряющие непосредственно таблицы. А когда вы даёте движку строку "INSERT ..." (да, вы делаете это посредством вызова некоего метода Execute(), который просто передаёт эту строку в движок), тот должен понять, что переданная строка суть набор команд и данных, и ему в ответ надо произвести последовательный вызов определённых функций, передав им эти данные в параметрах, в результате чего в указанной таблице должна появиться строка (или несколько), содержащая переданные данные. Парсинг - (to parse - разбирать, производить структурный анализ) - это как раз и есть процесс превращения строки символов в цепь вызовов функций API. Если вы знаете SQL достаточно полно, вы можете представлять себе, насколько нетривиальная и сложная сия задача. А вы её - в цикл!!! >не ужели, чтобы отпарсить нужно столько времени >с INSERT примерно в 10 раз медленне работает! Теперь-то понятно? Передавая строку, содержащую SQL-выражение, вы добавляете дополнительное задание движку, по сравнению с работой через DAO. Ну а если источник данных - не локальная таблица, а SQL-сервер, то движок ничего сам с этой строкой не делает, он передает её серверу. Поэтому я говорю выше только про локальные таблицы. Можно сделать и так, чтобы использовать сколько угодно SQL-запросов в каких угодно циклах, не теряя производительности. Если вы в Access, вы конструируете запрос и сохраняете его под к-л именем на вкладке "Запросы" главного окна БД. Неважно при этом, написали ли вы его на SQL или руками слабали, при сохранении произойдет его парсинг, и в базе он сохранится в готовом для использования виде. Вызов такого запроса и передачу параметров делаем через QueryDef. Почему-то у меня такое ощущение, что Вы всё это знаете... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 10:07 |
|
|
start [/forum/topic.php?fid=45&msg=32063814&tid=1683021]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 158ms |
0 / 0 |