134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
||||||
1 | ||||||
Скорость incert-ов23.03.2018, 19:14. Показов 748. Ответов 10
Метки нет (Все метки)
Здравствуйте! Использую связку MS SQLServer Express 2017 + C#, и у меня достаточно специфичная проблема.
В приложение поступают данные, в районе 100к элементов, раз в 2 минуты. Из этих данных только небольшая часть (5-7%) - новые, остальное - дубли старых записей. Получать данные иначе не получится 100%. По окончанию загрузки данных, программа записывает их в локальную БД, примерно таким вот образом:
Основная проблема в том, что каждый incert с проверкой, таким образом, занимает в районе 0,5 секунды, из-за чего программа просто "захлёбывается" поступающими данными. Если делать incert без проверки - появится огромное количество дублей. Фильтровать до вставки, я не совсем понимаю как - в программе хранится только текущий загружаемый набор данных, после сохранения они очищаются, т.е. сравнить не получится. Да и хранить в памяти несколько миллионов строк тоже не самая лучшая идея. Подскажите пожалуйста, как лучше решить эту проблему.
0
|
23.03.2018, 19:14 | |
Ответы с готовыми решениями:
10
Не используя имена элементов, найти скорость течения реки и скорость катера Скорость распространения волны и максимальная скорость колебаний частиц воздуха Вычислить путь пройденной лодкой, если известна её собственная скорость и скорость течения [Арканоид] Как вычислить скорость по X и Y имея угол направления шара и скорость движения? |
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
23.03.2018, 19:43 | 2 |
Прослойку написать не предлагать? Клиент в нее высерает , а уж там организовывай
0
|
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
|
23.03.2018, 19:44 [ТС] | 3 |
pincet, можно чуть подробнее?
0
|
784 / 615 / 273
Регистрация: 04.08.2015
Сообщений: 1,707
|
||||||
23.03.2018, 23:25 | 4 | |||||
Захарка, создаете в БД таблицу со структурой, которая идентична получаемым данным. Сделайте в ней индекс на поле id. Назовем ее TempTable.
Из клиентского приложения выполняете: 1. truncate TempTable - быстрая очистка старых записей. 2. С помощью SqlBulcCopy импорт ваших данных в TempTable. 3. Выполнение запроса типа
0
|
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
|
23.03.2018, 23:28 [ТС] | 5 |
Igr_ok, спорное решение - в итоге получится, что несколько миллионов записей будут гоняться между таблицами туда-сюда, при каждом обновлении.
0
|
784 / 615 / 273
Регистрация: 04.08.2015
Сообщений: 1,707
|
|
24.03.2018, 10:01 | 6 |
Захарка, это стандартное решение для вашей "достаточно специфичной проблемы". Если вы опишите задачу целиком, не предлагая при этом собственного решения, то можно будет что-то оптимизировать.
0
|
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
|
24.03.2018, 15:04 [ТС] | 7 |
Igr_ok, Печально, если более изящного решения нет. А, насчёт оптимизации - сегодня утром, до меня дошло, как можно отфильтровать данные, храня, относительно небольшое, количество информации. Так что тему можно закрывать...
Добавлено через 2 часа 7 минут Igr_ok, не подскажите, насчёт ещё одного момента? Проблема такая появилась: При работе с локальной тестовой БД, на моём пк - всё ок. Как только пытаюсь запустить приложение с бд на сервере, выкидывает ошибку: Кликните здесь для просмотра всего текста
Истекло время ожидания. Время ожидания истекло раньше, чем удалось получить подключение из пула. Возможно, все подключения в пуле уже используются и достигнут максимальный размер пула При этом, эта ошибка выскакивает и, если подключаться к бд с моего ПК по ip, и, если подключаться локально, перенеся программу на сервер. Все коннекты всегда закрываю, везде использую Dispose. В интернетах пишут, что она возникает из-за кучи незакрытых коннектов, но я даже перезапускал сервер полностью, но всё равно - ошибка стабильно вылетает прямо на первых запросах. При этом, у тестовой бд на моём пк таких проблем нету. Добавлено через 1 час 9 минут Update: Так, причину ошибки нашёл - я создавал бд на своём компе, и переносил на сервак. Если создать бд на сервере, ошибки нет. Добавлено через 1 час 39 минут Update2: Хм... У меня неиллюзорное такое подозрение, что серверу не хватает оперативки. Залил данные в бд на сервере копированием из другой таблицы (3 миллиона записей) - программа вываливается с ошибкой. Очистил таблицу - отлично пашет.
0
|
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
|
|
24.03.2018, 16:48 | 8 |
Видимо какая-то секретная ошибка. Но зато доподлинно известно, что ее причина - нехватка памяти.
0
|
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
|
24.03.2018, 16:55 [ТС] | 9 |
invm, О-о В смысле - секретная, я же в посте написал текст исключения, которое возникает при подключении запущенной в вижуал студии программы к серверной бд.
"Истекло время ожидания. Время ожидания истекло раньше, чем удалось получить подключение из пула. Возможно, все подключения в пуле уже используются и достигнут максимальный размер пула" А на самом сервере программа вываливается с виндосовской ошибкой, без указания инфы. А, на объём памяти я грешил потому, что её там (на сервере) банально мало, и при запуске было занято 99%.
0
|
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
|
|
24.03.2018, 17:48 | 10 |
Захарка, "Истекло время ожидания. Время ожидания истекло раньше, чем удалось получить подключение из пула. Возможно, все подключения в пуле уже используются и достигнут максимальный размер пула" - это не клиентская ошибка, а не серверная. При работе с SQL Server возможны два тайм-аута - logon и query. Неизвестно какой у вас, может вообще проблема только в клиенте.
Ошибка может быть без сообщения, но ошибок без кода не бывает. К тому же, SQL сервер не ругается виндосовскими ошибками. Так что пока не будет конкретики, помочь трудно.
0
|
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
|
|
24.03.2018, 20:56 [ТС] | 11 |
invm, Короче говоря, разобрался. Всё дело, в итоге, свелось к тому, что действительно была проблема с пулами. Не совсем понимаю, по какой причине (видимо, как раз, из-за разницы в ресурсах железа), моя локальная бд имела больший пул для коннектов. В итоге, проблему решил простым удалением коннекта из пула, при закрытии.
0
|
24.03.2018, 20:56 | |
24.03.2018, 20:56 | |
Помогаю со студенческими работами здесь
11
Очень маленькая скорость интернета, по Скайпу невозможно разговаривать. Как добавить скорость? Помогите рассчитать скорость шарика при полете (учитывая скорость встречного ветра) Определить конечную скорость шарика. какой угол с поверхностью листа образует эта скорость Нужно узнать угловую скорость и скорость точки на колесе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |