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

Откуда: оттуда
Сообщений: 360
Собственно, сабж.

create table dbo.test_table  (a int);
--delete from [dbo].[test]


create proc [dbo].[test_proc]
as 
begin
insert into  [dbo].[test_table] values (1)
end;


while 1=1 
begin
declare @object int
declare @src varchar(255)
exec @rc = sp_oacreate 'wscript.shell', @object out
exec  @rc = sp_oamethod @object,
                     'run',
                     null,
                    'sqlcmd -E -d db_name -S server_name -q "test_proc"'
exec sp_oadestroy @object
end
--select * from [dbo].[test_table]


При выполнении вышеприведенного SQL-скрипта с OLE процедурами, запускается новый экземпляр программы sqlcmd и после выполнения он остается запущенным.
При добавлении EXIT после завершения закрывается программа. Но столкнулся с тем, что таких экземпляров можно открыть 111 штук (ну во всяком случае у меня на сервере). То есть если даже обернуть в EXIT(), но долго идет выполнение ХП, то таких параллельных сеансов можно вызвать всего лишь 111 штук. 112 сеанс просто не запускает программу sqlcmd. Что это за ограничение такое? И как его преодолеть?
5 июн 19, 16:56    [21902762]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Мсье, определенно, знает толк в извращениях.
Вы вот этим все безобращием что пытаетесь сделать?
5 июн 19, 17:03    [21902770]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
Гавриленко Сергей Алексеевич
Мсье, определенно, знает толк в извращениях.
Вы вот этим все безобращием что пытаетесь сделать?


Ассинхронную работу процедуры. Есть таблица с разными значениями в каждой строке, и мне нужно обработать всю таблицу, то есть взять значение и запустить процедуру с этим значением.

Допустим, сложная процедура выводит отчет по определенным параметрам. В течении дня от пользователей собираются в таблицу эти параметры. В течении ночи таблица обрабатывается. Однако процедура сложная. и может занять некоторое время на обработку. По этому потребовалась ассинхронный запуск (параллельная работа) одной и тоже процедуры, но с разными параметрами. Соответственно, если вычисления идут параллельно и асинхронно, процесс занимает гораздо меньше времени.
5 июн 19, 17:15    [21902782]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
L_argo
Member

Откуда:
Сообщений: 1137
Что мешает сделать ХП, которая в цикле переберет нужные ИД и запустит с ними сабжевую ХП ?

Пусть даже с ДинамикСКЛ, но без идиотской командной строки.
5 июн 19, 17:36    [21902806]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
L_argo
Что мешает сделать ХП, которая в цикле переберет нужные ИД и запустит с ними сабжевую ХП ?

Пусть даже с ДинамикСКЛ, но без идиотской командной строки.

асинхронно?

Не знаю что там нового, но асинхронность на уровне sql делали
1. 2..N джобов на потоки
2. server broker
3. создание/прибивание/запуск джобов из управляющей хп
5 июн 19, 17:40    [21902813]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
Ёжик25,

Читайте справку по sqlcmd о разнице между -q и -Q
5 июн 19, 17:47    [21902829]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
TaPaK
L_argo
Что мешает сделать ХП, которая в цикле переберет нужные ИД и запустит с ними сабжевую ХП ?

Пусть даже с ДинамикСКЛ, но без идиотской командной строки.

асинхронно?

Не знаю что там нового, но асинхронность на уровне sql делали
1. 2..N джобов на потоки
2. server broker
3. создание/прибивание/запуск джобов из управляющей хп


У меня динамическое количество таких записей. По моему, для каждой итеррации создавать, выполнять и затем убивать "временный" джоб - еще большее извращение)). А service broker, я так понимаю - это решение. Но оно усложнит и без того сложную логику работы базы и ее поддержки.
Скажем так, если работу на уровне sqlcmd администратор знает (не DBA), и может потом что то сделать, как то разобраться и покилять зависшие процессы (ну или еще чего), то с service broker'ом он точно не справится. По этому пытаюсь решить пока без SB. И вот столкнулся с таким ограничением.
5 июн 19, 17:56    [21902839]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
Ёжик25,

Существует такая вещь, как "прикладное программное обеспечение". То, что вы делаете - полное извращение, как справедливо заметили.
5 июн 19, 18:02    [21902848]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
invm
Ёжик25,

Читайте справку по sqlcmd о разнице между -q и -Q


-Q = EXIT()

Я выше писал, что мне не подходит такой метод (точнее подходит, конечно же, но без ограничений в количестве запускаемых экземпляров программы), так как я не знаю, как долго будет выполняться нужная процедура.
Если поставить в test_proc строку
waitfor delay '00:00:59'

то за 2 минуты вставилось как раз 222 записи. То есть запустилось 111 экземпляров sqlcmd, они подождали 59 секунд и выполнились.
За эту минуту цикл while продолжает работать, но запуск новых экземпляров sqlcmd не происходит. После освобождения "пула" запущенных экземпляров while продолжился и опять запустил 111 экземпляров программы.
5 июн 19, 18:06    [21902855]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
Владислав Колосов
Ёжик25,

Существует такая вещь, как "прикладное программное обеспечение". То, что вы делаете - полное извращение, как справедливо заметили.


То есть что бы как то обойти это ограничение, нужно будет морочится с дополнительными сервисами, службами и прочими прикладными ПО?

Задача просто запускать одну и ту же процедуру в разных сессиях автоматически, для ее параллельной работы. Больше ничего не требуется. Устанавливать сервисы, ПО и прочее, и прикручивать к скулю - такое же извращение, имхо. Зачем? Если средствами скуля все прекрасно работает, и полностью удовлетворяет поставленную задачу, но сейчас только для 111 итерраций почему то. Где откопать это ограничение на количество одновременно работающих экземпляров sqlcmd?
Я так и не пойму, чье это ограничение, винды или скуля.

ps кстати для osql таких одновременно работающих экземпляров может быть 114.
5 июн 19, 18:14    [21902870]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
aleks222
Member

Откуда:
Сообщений: 852
Что делают ежики, когда делать нечего?

ЗЫ. PowerShell способен запустить "до хрена" витков.
Ну... и выполнить в каждом вызов процедуры.

ЗЗЫ. Хотя, если бы ежики всей страны бросили свои силы на банальную оптимизацию процедуры - да никому эти витки не нужны бы были.
5 июн 19, 18:23    [21902878]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Делайте очередь и разгребайте ее джобами. Все в пределах стандартных сервисов.

Вариантов -- вагон, маленькая тележка и вдеро.
5 июн 19, 18:24    [21902880]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
aleks222
Member

Откуда:
Сообщений: 852
Гавриленко Сергей Алексеевич
Делайте очередь и разгребайте ее джобами. Все в пределах стандартных сервисов.

Вариантов -- вагон, маленькая тележка и вдеро.


Не. 100 джобов - это фиаско, братан.

А 500 асинхронных соединений с сервером в .ps1 - это лехко.
5 июн 19, 18:31    [21902888]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
aleks222
Не. 100 джобов - это фиаско, братан.
Аргументировано.
5 июн 19, 18:37    [21902895]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
Гавриленко Сергей Алексеевич
Делайте очередь и разгребайте ее джобами. Все в пределах стандартных сервисов.

Вариантов -- вагон, маленькая тележка и вдеро.


простите, а sqlcmd разве не стандартный сервис?

Вот как раз по этой ссылке и нашел самое простое решение - OLE автоматизация и запуск sqlcmd.

Сторонние сбоки ставить не позволяют требования безопасности.
Стороннее ПО так же не подойдет по этим же причинам.
Джобы тоже не подходят (не плодить же для каждой строки "временный" джоб).
Service Broker тяжело поддерживать (к примеру) непосвященному человеку (в данному случае обычному сисадмину). Он не будет в дальнейшем разбираться в этой технологии. А вот метод, который я выбрал для него будет понятен и очевиден на мой взгляд.


Ошибка винды при попытке запуска 112-го экземпляра sqlcmd:

Faulting application name: SQLCMD.EXE, version: 2014.120.5000.0, time stamp: 0x5764ad7d
Faulting module name: KERNELBASE.dll, version: 6.3.9600.18821, time stamp: 0x59ba86db
Exception code: 0xc0000142
Fault offset: 0x00000000000ece70
Faulting process id: 0x7f90
Faulting application start time: 0x01d51baf58809552
Faulting application path: C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE
Faulting module path: KERNELBASE.dll
Report Id: 963175b3-87a2-11e9-80cc-0050568030e2
Faulting package full name:
Faulting package-relative application ID:

хм, значит ограничения dll библиотеки что ли некое?
5 июн 19, 18:39    [21902896]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
aleks222
Гавриленко Сергей Алексеевич
Делайте очередь и разгребайте ее джобами. Все в пределах стандартных сервисов.

Вариантов -- вагон, маленькая тележка и вдеро.


Не. 100 джобов - это фиаско, братан.

А 500 асинхронных соединений с сервером в .ps1 - это лехко.


Простите за назойливость). Плохо очень с PS знаком, может быть есть ссылка на примерные решения? А то боюсь, что долго очень ковыряться буду.
5 июн 19, 18:44    [21902899]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
aleks222
Member

Откуда:
Сообщений: 852
Ёжик25
aleks222
пропущено...


Не. 100 джобов - это фиаско, братан.

А 500 асинхронных соединений с сервером в .ps1 - это лехко.


Простите за назойливость). Плохо очень с PS знаком, может быть есть ссылка на примерные решения? А то боюсь, что долго очень ковыряться буду.


1. Цикл там называется for
2. создание подключение - сам освоишь.
3. ну и каждое подключение имеет метод асинхронного вызова процедуры.

Можно также на C# или VBA/VBS.

PS. Извини, я не ежик и ерундой не занимаюсь.
Любая процедура, которая требует запуска более 2-х экземпляров из соображений "так быстрее" - подлежит уничтожению.
5 июн 19, 18:51    [21902906]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
aleks222
Ёжик25
пропущено...


Простите за назойливость). Плохо очень с PS знаком, может быть есть ссылка на примерные решения? А то боюсь, что долго очень ковыряться буду.


1. Цикл там называется for
2. создание подключение - сам освоишь.
3. ну и каждое подключение имеет метод асинхронного вызова процедуры.

Можно также на C# или VBA/VBS.

PS. Извини, я не ежик и ерундой не занимаюсь.
Любая процедура, которая требует запуска более 2-х экземпляров из соображений "так быстрее" - подлежит уничтожению.


А я вот занимаюсь, представь себе. Мне еще за это и деньги платят. Удивительно наверно, да?))
Ну не будем спорить, кто тут из нас ерундой занимается.
В целом попробую на PS все это замутить. Благодарствую.

На вопрос никто так и не ответил про ограничения. Так что тему пока не закрываю. Просто уже интересно стало, что это за ограничение такое в запуске ограниченного количества экземпляров slqcmd.
5 июн 19, 19:06    [21902910]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
aleks222
Member

Откуда:
Сообщений: 852
Еще раз, 500 экземпляров, исполняющейся параллельно, процедуры бесполезны.
5 июн 19, 19:15    [21902920]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
aleks222
Еще раз, 500 экземпляров, исполняющейся параллельно, процедуры бесполезны.


Почему?
5 июн 19, 19:18    [21902926]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
Ёжик25
Почему?
Опишите, что делает эта процедура и вам объяснят почему. Или сочтут ваш подход приемлимым.
5 июн 19, 20:05    [21902940]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
vikkiv
Member

Откуда: London
Сообщений: 2622
aleks222
Еще раз, 500 экземпляров, исполняющейся параллельно, процедуры бесполезны.

может у него стресс-тестирование, там и миллион запросов без проблем послать, да с разных машин под разными пользователями


Ёжик25
вот PS образец запускающий множество $z параллельных job-ов (минус время на запуск и выделение ресурсов)
просто генерирующий случайное int число с максимумом $mx , можно под соединения/sql скрипты переделать и пускать на каждый job свой сервер/connection string/пользователя и т.д. из какого-то массива (который тоже может прилететь из SQL)
cls;[int]$z=32;[Array]$a=@(1..$z);[Array]$b=@();[int]$mx=99;foreach($jb in Get-Job){$jb|Remove-Job -Force >$null}
foreach($x in $a){Start-Job -ScriptBlock{param([int]$max,[int]$d)Start-Sleep -Seconds 1;Get-Random -Maximum $max -SetSeed $d} -ArgumentList $mx,$x|Out-Null}
while((Get-Job|Where-Object{$_.State -eq "Running"}).Count -ge 2){cls;write-output "running jobs";Get-Job;start-sleep -Seconds 1}
write-output "collecting results..";foreach($jb in Get-Job){$jb|Receive-Job -Wait -OutVariable jb_out -ErrorAction SilentlyContinue >$null;$jb|Remove-Job -Force;$b=$b+$jb_out}
write-output "here goes your result: $b";Remove-Variable * -ea 0;$Error.Clear()
5 июн 19, 23:04    [21903003]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
vikkiv
Member

Откуда: London
Сообщений: 2622
а так-то да, всё по делу советуют - не для этого sql система,
все приблуды не будут полноценными
т.к. предназначены только как вспомогательные средства
и платформа изначально заточена под несколько другие цели,

так что нечего горевать что упирается в ограничения да
не работает как мечталось и как выше намекнули .. на кактус ..
5 июн 19, 23:10    [21903006]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
L_argo
Member

Откуда:
Сообщений: 1137
А я вот занимаюсь, представь себе. Мне еще за это и деньги платят. Удивительно наверно, да?))
Не удивительно. В ИТ половина случайных людей. Даже с высокими зарплатами. Так везде, а не только в ИТ.
6 июн 19, 08:45    [21903122]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение в запуске экземпляров sqlcmd через OLE автоматизацию  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 360
vikkiv
aleks222
Еще раз, 500 экземпляров, исполняющейся параллельно, процедуры бесполезны.

может у него стресс-тестирование, там и миллион запросов без проблем послать, да с разных машин под разными пользователями


Ёжик25
вот PS образец запускающий множество $z параллельных job-ов (минус время на запуск и выделение ресурсов)
просто генерирующий случайное int число с максимумом $mx , можно под соединения/sql скрипты переделать и пускать на каждый job свой сервер/connection string/пользователя и т.д. из какого-то массива (который тоже может прилететь из SQL)
cls;[int]$z=32;[Array]$a=@(1..$z);[Array]$b=@();[int]$mx=99;foreach($jb in Get-Job){$jb|Remove-Job -Force >$null}
foreach($x in $a){Start-Job -ScriptBlock{param([int]$max,[int]$d)Start-Sleep -Seconds 1;Get-Random -Maximum $max -SetSeed $d} -ArgumentList $mx,$x|Out-Null}
while((Get-Job|Where-Object{$_.State -eq "Running"}).Count -ge 2){cls;write-output "running jobs";Get-Job;start-sleep -Seconds 1}
write-output "collecting results..";foreach($jb in Get-Job){$jb|Receive-Job -Wait -OutVariable jb_out -ErrorAction SilentlyContinue >$null;$jb|Remove-Job -Force;$b=$b+$jb_out}
write-output "here goes your result: $b";Remove-Variable * -ea 0;$Error.Clear()


Премного благодарен.

Но вопрос все равно остается открытый. Что за ограничение такое в запуске n-ого количества экземпляров sqlcmd? Это неизлечимо, или можно что нибудь придумать.
6 июн 19, 12:02    [21903334]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить