|
|
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
ГурЫ, плиз, подскажите! Как увеличить скорость вставки записей в базу на MS SQL server из делфи. Пробовал через ADO, BDE, dbExpress, все равно неудовлетворительно! Нужно каждый день заводить примерно 700000 записей, на это уходит сейчас примерно 3 часа времени. Подскажите как это делать быстрее, через какие средства, или как настроить компоненты? P.S. если из делфи их выводить в обычный текстовик, то операция занимает 10-15 минут!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 09:55:14 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Может индексов слишком много? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 09:58:29 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
использовать bulk copy... оставить только самые необходимые индексы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:05:52 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Если речь идёт просто об импорте больших массивов информации, то можно использовать bcp или dts. Если это не подходит, то формируйте батчи для вставки (группами по, например, 1000 записей). Для максимального быстродействия, тем более если есть много индексов или сложные триггеры, пишите батчи так: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:10:41 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Итак только 3 поля индексный (из 28), только самое необходимое! У меня еще вот какой вопрос: Сервер кеширует ли вставки? Потому что видно (сделано в делфях) как он вставляет: штук 500-600 вставит, дальше штук 30 тормозит, потом снова "побежал". и так повторяется. Но даже когда "бежит" все равно медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:11:57 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
А зачем вам тогда база, если в текстовик можете - шутка! -посмотрите индексы - они вставку сильно тормозят, а если еще есть и CLUSTERED, тогда со вставками вообще тяжело... -через что коннект к серверу,сколько клиентов на нем и как он (сервер) ими загружен? -и еще, почему скорость не удовлетворяет? всего 3 часа в день... так у вас еще 21 час в запасе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:12:39 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Вопрос: А что является источником данных? Как именно вы вставляете данные? (Кусочек "вставляюшего" кода можно посмотреть?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:30:00 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Кстати, забыл сказать... Делайте блоки вставок в одной транзакции. Это ускорает вставку в несколько раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:30:45 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Кусочек кода: Да простой код, в одном случае через sql команду INSERT, в другом через процедуру на сервере, которая делает тот-же самый INSERT. Так проверяли, что быстрее. INSERT вида: INSERT <таблица> VALUES (поле1,поле2,...,полеN) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 11:16:21 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Как увеличить скорость вставки записей в базу на MS SQL server из делфи. Никак P.S. если из делфи их выводить в обычный текстовик, то операция занимает 10-15 минут!!! Так и поступайте. После чего текстовик копируйте на сервер и запускайте DTS пакет (можно всё из делфи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 13:07:20 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
1. Попробуйте drop index... insert ...values... insert ...values... ... create index сам не делал, но люди говорят, что иногда это значительно быстрее чем просто insert ...values... insert ...values... Хотя это зависит от инексов 2. Проанализируйте объем данных (в Кб или Мб) и пропускную способность винта. PS а как вы представляете работу кеша при вставке???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 18:24:47 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
1*. Установить для БД Model Recovery = Bulk-Logged 2. Снести все индексы 3. Залить ASCII файл ("строки с разделителями") через BCP. 4. Создать индексы заново. На всякий случай кластерный не создавать. 5*. Восстановить для БД Model Recovery Если требуется - ASCII файл создать из клиента и из клиента делать п.2, 3, 4 (может быть 1 и 5) *П.п. 1 и 5 не являются обязательными Для 2 млн записей работает несколько минут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 18:41:14 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Я не зню собственно Delphi, но предполагаю, что каждая команда у Вас отсылается на сервер (в цикле). Так вот - неверное решение, если это так. Нужно формировать пакет команд (100-200-1000 в string - сколько поместится), а потом этот пакет уже отсылать серверу. Ну и если CLUSTERED индекс присутсвует, то установить ему FILLFACTOR порядка 50%. ЗЫ Кстати, коллеги, кто-нибудь анализировал, как себя ведет кластерный индекс с филлфактором меньше 1.0 при заполнении свободного пространства? Происходит его расширение с указанным параметром, или нужно ручками указать снова 0.5? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 18:48:22 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
1. База на RAID1-2 винта, по статистике пропускной способности хватает! 2. Кластерных индексов нет. 3. Вообще сейчас все индексы грохнули(для тестов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 07:05:12 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Я согласен с akuz. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 09:42:30 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
А чем же всё-таки вам не нравится вариант с DTS. У меня была похожая ситуация, правда в VB. Нужно было выгрузить в SQL таблицы из Access и обратно. Сделал я сначала по простому, на клиенте через ADO построчное копирование, (был сильно ограничен по времени) работало минут 10. В следующей версии заказчик попросил снизить время загрузки. Я сделал средствами EM пакет DTS и при тестировании всё проскочило за минуту. Подключил к проекту нужный DLL, написал три строчки кода и никаких проблем, кроме, пожалуй необходимости наличия DTS на клиенте. Но и эта проблема решилась установкой на клиента MSDE. В вашем же слечае локальная установка DTS на клиенте вовсе не нужна. Нужно лишь расшарить каталог на SQL Servere (или другими ср-вами вашего приложения) и загнать туда текстовый файл опред. формата. После чего, через ADO запустить процедуру которая запускает DTS используя sp_OA..., xp_cmdshell, запуск job или ещё как, на ваш вкус. Есть ещё вариант использовать OPENDATASOURCE или OPENROWSET. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 10:12:00 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Да кстати а нет ли навороченных триггеров по этой таблице? В любом случае при решении таких проблем следует запустить трасировку (Profiler) и на основании этих данных и искать решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 10:44:23 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
akuz прав. Слить все в текстовуху, скопировать на сервер и запустить примерно такую процедурку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. DTS и sp_OA.... отдыхают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 10:56:03 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Прежде чем грохать индексы надо было прочитать это: 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-ого дня вставки (если у вас кластерный и два некластерных), алгоритм по которому происходит удаление инжексов, а затем вставка данных и создание индексов будет не оптимальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 11:00:06 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
2 VVG_ Согласен, я просто зациклился на своём случае с аксесом. Для текста, конечно, BULK INSERT! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 11:25:39 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
2Алексей Кубенко: этот кусок документации относится к BULK INSERT операциям, которые как раз и не используются (насколько я понимаю) 2akuz & VVG_: если сервер не доступет в локальной сети, то тогда остается только DTS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 11:48:12 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
Да и последнее что пришло в голову смотрим не тормозит ли сетка (если она конечно есть. наверное самое простое это вывод в тот же текстовик, но в shared на той же машине где и MS SQL стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 12:14:48 |
|
||
|
Как увеличить скорость вставки???
|
|||
|---|---|---|---|
|
#18+
2 Nikolay. Да никто не отрицает, что-то, что я привел справедливо для BULK INSERT, но человеку советовали использовать DTS что впрочем и вы советуете. 2 Nikolay & VVG Вопрос. Как по вашему через что работает DTS? Так вот я вам отвечу DTS как раз и использует BULK COPY (для этого я и привел эту информацию). Поэтому утверждать, что DTS отдыхает в отличие от Bulk insert я бы не стал (те же яйца, только вид сбоку), надо правильно настраивать пакет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 12:18:39 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32055351&tid=1819853]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 362ms |

| 0 / 0 |
