Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
Их Delphi, с помощью TADOQuery вставляю записи в таблицу MSSQLServer 2012. Подключаюсь через Native Client по протоколу Shared Memory. Вставка происходит со скоростью примерно 5000 записей в секунду. Если же разделить вставляемые данные на 5 частей и вставлять их из 5 копий программы - то каждая копия будет вставлять с той же скоростью. Суммарная скорость вставки получается 25000 записей в секунду.

Вопрос: Как мне добиться того, чтобы вставлять сразу с этой скоростью и без плясок с разделением данных?
8 сен 14, 22:51    [16552176]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Glory
Member

Откуда:
Сообщений: 104751
stvort
Вопрос: Как мне добиться того, чтобы вставлять сразу с этой скоростью и без плясок с разделением данных?

BULK INSERT
8 сен 14, 23:02    [16552208]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
приведите текст строки коннекта
8 сен 14, 23:06    [16552223]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
BULK INSERT штука хорошая конечно, но ее трудно контролировать и для нее нужно готовить файл с данными.
Я же хотел просто получить от сервера то, что он и так мне дает при записи с нескольких копий программы.

Строка такая:
Provider=SQLNCLI11.1;Password=password;Persist Security Info=True;User ID=UserName;Initial Catalog=DBName;Data Source=localhost;
8 сен 14, 23:14    [16552258]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
stvort
Я же хотел просто получить от сервера то, что он и так мне дает при записи с нескольких копий программы.
Значит перепишите ваше приложение так, чтобы оно могло использовать возможности сервера более эффективно.
8 сен 14, 23:29    [16552310]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
stvort
BULK INSERT штука хорошая конечно, но ее трудно контролировать и для нее нужно готовить файл с данными.
Просто используйте SqlBulkCopy, не нужно готовить файлы.
8 сен 14, 23:32    [16552317]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
alexeyvg
stvort
BULK INSERT штука хорошая конечно, но ее трудно контролировать и для нее нужно готовить файл с данными.
Просто используйте SqlBulkCopy, не нужно готовить файлы.
А, из дельфи, я подумал про C#... Можно попробовать спросить на форуме ддельфи, есть ли там SqlBulkCopy.
Еслит нет, то распараллеливать.
8 сен 14, 23:34    [16552320]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
Т.е. последовательно, в одном потоке я быстро данные не запишу? Несколько странно. И приложение и база и сервер находятся на одной машине. Ресурсы точно не на пределе ибо в том же аксессе я могу писать 30000 записей в секунду. Правда через DAO. Но полностью контролируя процесс с помощью эксепшенов и без всякого распараллеливания. Неужели SQLServer работает медленнее аксесса? Понятно, что лог транзакций тормозит процесс вставки, но не настолько же.
8 сен 14, 23:45    [16552341]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
А пишите, наверное, построчно с автокоммитом?
9 сен 14, 00:05    [16552372]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
stvort
Неужели SQLServer работает медленнее аксесса? Понятно, что лог транзакций тормозит процесс вставки, но не настолько же.
А с чего вы взяли что тормозит сервер, а не приложение?
И как работает TADOQuery? Шлёт 100500 запросиков?
9 сен 14, 02:11    [16552458]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
Пишу по 10000 записей в транзакции. Сначала подготавливаю текст запроса с параметрами. Выставляю Prepared = True. Далее в цикле по данным выставляю значения параметров и выполняю ExecSQL.
9 сен 14, 07:59    [16552619]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
автор
А с чего вы взяли что тормозит сервер, а не приложение?

Я просто предположил, что мне сервер не отдает 100% ресурсов даже если они не заняты. А так конечно может и ADO медленно работать. Но в этом случае хотелось бы узнать альтернативный (быстрый) способ подключения к SQLServer из Delphi.
9 сен 14, 08:08    [16552630]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
aleks2
Guest
stvort
Их Delphi, с помощью TADOQuery вставляю записи в таблицу MSSQLServer 2012. Подключаюсь через Native Client по протоколу Shared Memory. Вставка происходит со скоростью примерно 5000 записей в секунду. Если же разделить вставляемые данные на 5 частей и вставлять их из 5 копий программы - то каждая копия будет вставлять с той же скоростью. Суммарная скорость вставки получается 25000 записей в секунду.

Вопрос: Как мне добиться того, чтобы вставлять сразу с этой скоростью и без плясок с разделением данных?

Пять потоков в программе сделать и пять подключений с сервером открыть.
А можно просто пять асинхронных подключений с с сервером открыть
9 сен 14, 08:12    [16552634]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
stvort
я могу писать 30000 записей в секунду.


На SQL 2012 можете попробовать писать во временную таблицу или физическую таблицу без индексов

На SQL 2014 можно вопользоваться INMEMEORY таблицей в качестве буфера (это один из рекомендованных случаев пррименение INMEMEORY) . BULK INSERT в INMEMORY работает очень быстро и очень хорошо параллелиться.
9 сен 14, 13:10    [16554011]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Glory
Member

Откуда:
Сообщений: 104751
stvort
BULK INSERT штука хорошая конечно, но ее трудно контролировать и для нее нужно готовить файл с данными.

А сейчас 25000 записей в секунду откуда возникают ? Из воздуха генерируются ?
9 сен 14, 13:12    [16554019]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Glory
BULK INSERT штука хорошая конечно, но ее трудно контролировать и для нее нужно готовить файл с данными.


Нахрена этот файл?

1) SqlBulkCopy
2) SSIS -> Fast Insert и всё идёт на скорости
9 сен 14, 13:32    [16554139]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
stvort, Попробуйте вариант: MS SQL Server с базой данных на одной машине, а приложение на другой машине.
9 сен 14, 14:32    [16554517]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
автор
А сейчас 25000 записей в секунду откуда возникают ? Из воздуха генерируются ?


Данные у меня в бинарных файлах.
9 сен 14, 18:14    [16556092]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Glory
Member

Откуда:
Сообщений: 104751
stvort
автор
А сейчас 25000 записей в секунду откуда возникают ? Из воздуха генерируются ?


Данные у меня в бинарных файлах.

А вы уверяли, что файлы придется формировать.
Что за файлы ?
9 сен 14, 21:57    [16556718]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
stvort
Member

Откуда:
Сообщений: 9
Ну я имел ввиду, что для запроса BULK INSERT FROM .... нужно передать файл в текстовом формате с разделителями или в собственном формате SQLServer. Я пробовал так делать, но:
1. Это слегка через жопу.
2. Если хоть одна строка не подходит для вставки - срывается вся вставка (ну или пакет если указан его размер).
3. На время вставки полностью блокируется таблица
4. Я так понимаю, что такие операции не попадают в лог транзакций
9 сен 14, 22:18    [16556797]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer 2012 повысить скорость вставки записей через ADO  [new]
Glory
Member

Откуда:
Сообщений: 104751
stvort
нужно передать файл в текстовом формате с разделителями

А бинарный - это не текстовый ?
А при фиксированной длине полей разве разделитель нужен ?

stvort
1. Это слегка через жопу.

Что это то ?

stvort
2. Если хоть одна строка не подходит для вставки - срывается вся вставка (ну или пакет если указан его размер).

Т.е. размер пакета в 1ну запись вам не подходит ?

stvort
3. На время вставки полностью блокируется таблица

А своими отдельными инсертами не блокируете что ли никого ?

stvort
4. Я так понимаю, что такие операции не попадают в лог транзакций

Вы понимаете неправильно
9 сен 14, 22:41    [16556870]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить