powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как увеличить скорость вставки???
24 сообщений из 24, страница 1 из 1
Как увеличить скорость вставки???
    #32055036
Griff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ГурЫ, плиз, подскажите!
Как увеличить скорость вставки записей в базу на MS SQL server из делфи. Пробовал через ADO, BDE, dbExpress, все равно неудовлетворительно!
Нужно каждый день заводить примерно 700000 записей, на это уходит сейчас примерно 3 часа времени.
Подскажите как это делать быстрее, через какие средства, или как настроить компоненты?
P.S. если из делфи их выводить в обычный текстовик, то операция занимает 10-15 минут!!!
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055038
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может индексов слишком много?
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055045
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать bulk copy...
оставить только самые необходимые индексы...
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055047
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь идёт просто об импорте больших массивов информации, то можно использовать bcp или dts.
Если это не подходит, то формируйте батчи для вставки (группами по, например, 1000 записей).
Для максимального быстродействия, тем более если есть много индексов или сложные триггеры, пишите батчи так:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert MyTable(f1,f2,...)
select  1 , 2 ,...
union all
select  3 , 4 ,...
union all
...
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055049
Griff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак только 3 поля индексный (из 28), только самое необходимое!
У меня еще вот какой вопрос:
Сервер кеширует ли вставки?
Потому что видно (сделано в делфях) как он вставляет:
штук 500-600 вставит, дальше штук 30 тормозит, потом снова "побежал". и так повторяется.
Но даже когда "бежит" все равно медленно.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055050
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вам тогда база, если в текстовик можете - шутка!
-посмотрите индексы - они вставку сильно тормозят, а если еще есть и CLUSTERED, тогда со вставками вообще тяжело...
-через что коннект к серверу,сколько клиентов на нем и как он (сервер) ими загружен?
-и еще, почему скорость не удовлетворяет? всего 3 часа в день... так у вас еще 21 час в запасе
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055065
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос:

А что является источником данных?

Как именно вы вставляете данные? (Кусочек "вставляюшего" кода можно посмотреть?)
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055066
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, забыл сказать...
Делайте блоки вставок в одной транзакции.
Это ускорает вставку в несколько раз.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055090
Griff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кусочек кода:
Да простой код, в одном случае через sql команду INSERT, в другом через процедуру на сервере, которая делает тот-же самый INSERT. Так проверяли, что быстрее.
INSERT вида:
INSERT <таблица> VALUES (поле1,поле2,...,полеN)
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055151
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как увеличить скорость вставки записей в базу на MS SQL server из делфи.
Никак
P.S. если из делфи их выводить в обычный текстовик, то операция занимает 10-15 минут!!!
Так и поступайте.
После чего текстовик копируйте на сервер и запускайте DTS пакет (можно всё из делфи).
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055288
iMorsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
Попробуйте
drop index...
insert ...values...
insert ...values...
...
create index

сам не делал, но люди говорят, что иногда это значительно быстрее чем просто
insert ...values...
insert ...values...

Хотя это зависит от инексов


2.
Проанализируйте объем данных (в Кб или Мб)
и пропускную способность винта.

PS а как вы представляете работу кеша при вставке????
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055296
sergwsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1*. Установить для БД Model Recovery = Bulk-Logged
2. Снести все индексы
3. Залить ASCII файл ("строки с разделителями") через BCP.
4. Создать индексы заново. На всякий случай кластерный не создавать.
5*. Восстановить для БД Model Recovery

Если требуется - ASCII файл создать из клиента и из клиента делать п.2, 3, 4 (может быть 1 и 5)

*П.п. 1 и 5 не являются обязательными

Для 2 млн записей работает несколько минут
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055298
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не зню собственно Delphi, но предполагаю, что каждая команда у Вас отсылается на сервер (в цикле).
Так вот - неверное решение, если это так.
Нужно формировать пакет команд (100-200-1000 в string - сколько поместится), а потом этот пакет уже отсылать серверу.
Ну и если CLUSTERED индекс присутсвует, то установить ему FILLFACTOR порядка 50%.

ЗЫ Кстати, коллеги, кто-нибудь анализировал, как себя ведет кластерный индекс с филлфактором меньше 1.0 при заполнении свободного пространства? Происходит его расширение с указанным параметром, или нужно ручками указать снова 0.5?
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055351
Griff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. База на RAID1-2 винта, по статистике пропускной способности хватает!
2. Кластерных индексов нет.
3. Вообще сейчас все индексы грохнули(для тестов)
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055373
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я согласен с akuz.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055379
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем же всё-таки вам не нравится вариант с DTS.
У меня была похожая ситуация, правда в VB. Нужно было выгрузить в SQL таблицы из Access и обратно. Сделал я сначала по простому, на клиенте через ADO построчное копирование, (был сильно ограничен по времени) работало минут 10. В следующей версии заказчик попросил снизить время загрузки. Я сделал средствами EM пакет DTS и при тестировании всё проскочило за минуту. Подключил к проекту нужный DLL, написал три строчки кода и никаких проблем, кроме, пожалуй необходимости наличия DTS на клиенте. Но и эта проблема решилась установкой на клиента MSDE. В вашем же слечае локальная установка DTS на клиенте вовсе не нужна. Нужно лишь расшарить каталог на SQL Servere (или другими ср-вами вашего приложения) и загнать туда текстовый файл опред. формата. После чего, через ADO запустить процедуру которая запускает DTS используя sp_OA..., xp_cmdshell, запуск job или ещё как, на ваш вкус.

Есть ещё вариант использовать OPENDATASOURCE или OPENROWSET.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055386
iMorsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да кстати а нет ли навороченных триггеров по этой таблице?

В любом случае при решении таких проблем следует запустить трасировку (Profiler) и на основании этих данных и искать решение.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055398
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akuz прав. Слить все в текстовуху, скопировать на сервер и запустить примерно такую процедурку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create procedure blablabla 
as
BULK INSERT Northwind.dbo.[Order Details]
   FROM 'f:\orders\lineitem.tbl'
   WITH 
      (
         FIELDTERMINATOR = ',',
         ROWTERMINATOR = '|\n'
      )


DTS и sp_OA.... отдыхают.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055403
Прежде чем грохать индексы надо было прочитать это:

Optimizing Bulk Copy Performance
To bulk copy data as fast as possible, several options are available to specify how data should be bulk copied into Microsoft® SQL Server™ using the bcp utility or BULK INSERT statement, including:

Using logged and nonlogged bulk copies.
Using the bcp utility for parallel data loading.
Controlling the locking behavior.
Using batches.
Ordering data files.
For more information, see Factors Affecting Bulk Copy Performance.

--------------------------------------------------------------------------------

Note If possible, use the BULK INSERT statement rather than the bcp utility to bulk copy data into SQL Server. The BULK INSERT statement is faster than the bcp utility.


--------------------------------------------------------------------------------

Two factors determine which of these options can or should be used to increase the performance of bulk-copy operations:

Amount of existing data in the table compared to the amount of data to be copied into the table.
Number and type of indexes on the table.
Additionally, these factors depend on whether data is bulk copied into a table from a single client or in parallel from multiple clients.

Loading Data into an Empty Table from a Single Client
When loading data into an empty table from a single client, it is recommended that you specify:

The TABLOCK hint. This causes a table-level lock to be taken for the duration of the bulk-copy operation.
A large batch size, using the ROWS_PER_BATCH hint. A single batch representing the size of the entire file is recommended.
A nonlogged bulk-copy operation. Transaction log backups should not be created after performing a nonlogged operation. For more information, see Backing Up Nonlogged Operations.
Additionally, if your table has a clustered index and the data in the data file is ordered to match the clustered index key columns, bulk copy the data into the table with the clustered index already in place and specify the ORDER hint. This is significantly faster than creating the clustered index after the data is copied into the table.

If nonclustered indexes are also present on the table, drop these before copying data into the table. It is generally faster to bulk copy data into a table without nonclustered indexes, and then to re-create the nonclustered indexes, rather than bulk copy data into a table with the nonclustered indexes in place.

Loading Data into a Nonempty Table from a Single Client
When copying data into a table that has existing data, the recommendation to perform the bulk copy operation with the indexes in place depends on the amount of data to be copied into the table compared to the amount of existing data already in the table. As the percentage of data to be copied into the table increases (based on the amount of existing data in the table), the faster it is to drop all indexes on the table, perform the bulk copy operation, and then re-create the indexes after the data is loaded.

As a rough guide, here are suggested figures for the amount of data to be added to a table for various types of indexes. If you exceed these percentages, you may find it faster to drop and re-create the indexes.

Indexes Amount of data added
Clustered index only 30%
Clustered and one nonclustered index 25%
Clustered and two nonclustered indexes 25%
Single nonclustered index only 100%
Two nonclustered indexes 60%


Получается, что начиная с 4-5-ого дня вставки (если у вас кластерный и два некластерных), алгоритм по которому происходит удаление инжексов, а затем вставка данных и создание индексов будет не оптимальным.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055421
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VVG_
Согласен, я просто зациклился на своём случае с аксесом.
Для текста, конечно, BULK INSERT!
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055436
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Алексей Кубенко: этот кусок документации относится к BULK INSERT операциям, которые как раз и не используются (насколько я понимаю)

2akuz & VVG_: если сервер не доступет в локальной сети, то тогда остается только DTS...
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055453
iMorsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и последнее что пришло в голову
смотрим не тормозит ли сетка (если она конечно есть.
наверное самое простое это
вывод в тот же текстовик, но в shared на той же машине где и MS SQL стоит.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055456
2 Nikolay. Да никто не отрицает, что-то, что я привел справедливо для BULK INSERT, но человеку советовали использовать DTS что впрочем и вы советуете.

2 Nikolay & VVG Вопрос. Как по вашему через что работает DTS?
Так вот я вам отвечу DTS как раз и использует BULK COPY (для этого я и привел эту информацию).
Поэтому утверждать, что DTS отдыхает в отличие от Bulk insert я бы не стал (те же яйца, только вид сбоку), надо правильно настраивать пакет.
...
Рейтинг: 0 / 0
Как увеличить скорость вставки???
    #32055458
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если вставлять надо из Delphi,
то можно использовать компонент TDataTransfer -
подкините скорость на 2-3 порядка :)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как увеличить скорость вставки???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]