ahmad_yossef Ответов: 2

Вторая хранимая процедура занимает слишком много времени


у меня есть приложение c#, когда пользователь нажимает на кнопку, он делает две вещи
сначала сохраните данные в таблицу с помощью хранимой процедуры
во вторых сохраните те же данные на другом сервере с помощью хранимой процедуры но этот сервер находится в другом месте и соединение немного медленное
мне нужно сделать второй процесс асинхронным мне не нужен результат от него
как и когда пользователь нажимает кнопку он должен дождаться завершения двух процедур
мне нужно, чтобы пользовательский интерфейс был активирован сразу же после завершения первой процедуры

Что я уже пробовал:

сделайте триггер на первой таблице, которая вставила данные во вторую базу данных, и удалите 2-й proceudre, но это также займет много времени

Richard MacCutchan

- не повезло"
Не полагайтесь на удачу. Вам нужно использовать логику, а также ваши навыки и опыт разработчика.

ahmad_yossef

так скажите мне, какую логику я должен использовать?

Richard MacCutchan

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

ahmad_yossef

ладно моя вина я отредактирую его прямо сейчас

ahmad_yossef

извините, что я обновил вопрос

2 Ответов

Рейтинг:
9

MadMyche

Как обычно, есть множество способов, которыми вы можете обойти это, в зависимости от ваших потребностей, ситуации и ваших способностей.

В вашем приложении вы можете использовать один из асинхронных методов объектов SqlCommand, например ExecuteNonQueryAsync() Это относительно легко сделать .

SQL Agent - это может быть использовано различными способами, например, при вставке ваших новых данных в постановка таблица, а затем запуск задание агента время от времени для выполнения хранимой процедуры с этими данными.
Более продвинутым способом использования агента SQL было бы создание пакета SSIS для выполнения функции ETL; захват данных из SQL 1 и применение изменений к SQL 2

И, естественно, это могут быть просто бинты, фиксирующие симптом плохого дизайна БД; поэтому просмотр задействованных схем всегда находится на столе.

и затем есть запрос, который вы выполняете; или, если быть более точным, данные, присоединяемые в качестве параметров. Вы пытаетесь протолкнуть огромный элемент данных BLOB-объекта?


Рейтинг:
20

Afzaal Ahmad Zeeshan

Цитата:
мне нужно сделать второй процесс асинхронным мне не нужен результат от него
Вместо того чтобы запускать его асинхронно, почему бы не использовать этот метод в C# вместо хранимой процедуры SQL. Видеть здесь, Класс SqlCommand (System.Data.SqlClient) | Microsoft Docs[^], все, что нужно сделать для второго запроса, - это выполнить функцию и забыть, что она когда-либо вызывалась. Вы можете сделать это с помощью Асинхронный аналоги функций выполнения запросов.

Свойство sqlcommand.Метод ExecuteReaderAsync (System.Data.SqlClient) | Microsoft Docs[^] (Изучите другие варианты для других типов запросов)

Если вы используете асинхронные аналоги, то вы можете выполнить первую хранимую процедуру, дождаться ответа (асинхронно, так как это помогает вам писать реактивные приложения и не блокирует потоки без необходимости), а для второй-просто вызвать функцию и не ждать ответа. Обратная сторона для этого? Задача, которая будет создана, будет находиться в пуле потоков, и базовая платформа все равно будет предполагать, что ее нужно обработать и дождаться, что приведет к утечке памяти, если ваше приложение выйдет преждевременно. В этом случае вы можете использовать SQL-аналог (см. ниже).

Есть некоторые вещи, которые вам нужно знать, прежде чем погрузиться в это.
c# - ужасная производительность при использовании асинхронных методов SqlCommand с большими данными - переполнение стека[^]

Но если вы все еще хотите использовать подход SQL, то вы можете использовать задания SQL и создать задание, которое работает в фоновом режиме, sql server - могу ли я запустить хранимую процедуру и немедленно вернуться, не дожидаясь ее завершения? - Администраторы Баз Данных Stack Exchange[^].