#c# #sql #multithreading
#c# #sql #многопоточность
Вопрос:
Я новичок в SQL, поэтому простите меня, если мой вопрос кажется детским.
Просто краткое описание моего приложения:
- У меня есть база данных SQL с двумя таблицами с именами таблиц: GUIelements, DataTable.
- Таблица GUIelements — это очень маленькая таблица из 50 строк
- DataTable — это очень большая таблица, содержащая около 300000 записей
- У меня также есть приложение на C #, в котором у меня есть динамически сгенерированный графический интерфейс на основе данных, доступных в GUIelements.
- Приложение C # имеет функцию, которая выполняется в отдельном потоке из графического интерфейса пользователя, и назначение этой функции — непрерывно (каждые 1 секунду) отслеживать таблицу GUIelements, чтобы увидеть, есть ли изменения в таблице. Я делаю это, каждый раз открывая соединение, запрашивая и закрывая соединение.
Все работает нормально, графический интерфейс обновляется должным образом, и я также могу выполнять запросы в базе данных из основного потока графического интерфейса. Все кажется идеальным.
==============================
Теперь я хотел бы создать другую функцию, которая будет запускаться снова в другом потоке, который будет запускаться каждые 10 минут. Целью этой функции будет извлечение всех записей DataTable и после того, как она извлекет их в локальный список, затем выполните некоторую низкоуровневую обработку, например, возьмите среднее значение данных.
Мои вопросы:
Лучше ли извлекать из базы данных sql всю таблицу данных один раз, сохранять ее во временном списке и выполнять обработку:
USING()
{
- OpenConnection
- Query amp; Store data in a big 300000 elements list
- Close Connection
- Process list
}
Или будет лучше извлекать данные из DataTable в пакетах, обрабатывать каждый пакет и затем запрашивать следующий пакет. Операция будет выглядеть следующим образом:
FOR LOOP 3 TIMES
USING()
{
- OpenConnection
- Query amp; Store data in a small 100000 elements list
- Close Connection
- Process list
}
END
Какой подход будет лучше?
Есть ли опасность, что некоторые запросы завершатся ошибкой из-за многопоточности?
Пожалуйста, имейте в виду, что размеры таблицы и списка не являются фактическими, но я использую эти цифры в качестве примера.
Ответ №1:
Если у вас есть память для хранения всех данных, то лучше сделать это в одном соединении. Чтобы избежать многократного обхода сети. Таким образом, решение зависит от ваших чисел реального размера.
Но если вам нужно AVG
, сделайте это в базе данных, а не в вашем приложении.
Комментарии:
1. Спасибо за ваш ответ. Извините, но мой пример был упрощен. Я делаю не просто среднее значение, я делаю гораздо больше, поэтому мне нужно вывести фактические данные из базы данных… Сейчас данные похожи на несколько тысяч записей, но за один месяц их может быть несколько миллионов. Итак, если возвращаемые данные могут быть очень большими, лучше ли второй подход?
2. Опять же, проблема не в передаче данных, проблема в том, как вы собираетесь хранить их в своем приложении, потому что зависит от того, сколько памяти у вас доступно. И даже если вам нужно выполнить гораздо больше вычислений, сделайте это в своей базе данных, используя одну процедуру хранения. Единственный случай, когда вы должны загрузить все данные, если вы создаете список элементов, и в этом случае вам следует создать пользовательский интерфейс разбивки на страницы.
3. Я работаю в другом сценарии, где вы хотите загрузить все данные. На случай, если вам нужна автономная функциональность, но для этого вы используете локальную базу данных с функциями репликации.