|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
|
Оптимизация скорости работы с БД (ADO, DataEnvironment)31.03.2011, 17:59. Показов 5024. Ответов 27
Метки нет (Все метки)
Привет!
Заканчиваю работу над приложением - интерфейсом БД. Использую MySQL через ADODB, DataEnvironment (один connection), данные в классе присобачиваются к формам, а на формах по несколько стандартных DataGrid'ов и по мелочи еще всего... При отладке у меня в таблицах БД было по 1-50 записей, все работало довольно быстро... Сейчас загнал в базу объем данных ближе к реальному (10 - 50 тыс.) Тормозит. Секунд по 5-10... На что в первую очередь обратить внимание при оптимизации? (гриды, свойства command'ов и connection (запросы), объектная часть или может еще чего?) БД будет расти, прога должна работать на компах слабее чем мой, вероятен многопользовательский режим => скорость критична...
0
|
|
| 31.03.2011, 17:59 | |
|
Ответы с готовыми решениями:
27
Оптимизация или увеличение скорости работы программы Телефонный справочник или оптимизация скорости работы с данными Нужен совет: оптимизация кода, увеличение скорости работы скрипта |
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 05.04.2011, 12:13 | |
|
с SHAPE полюбому все грузится на клиента при любом провайдере.
надо было сразу задуматься над OLAP-сервером теперь или все переписывать или сразу все данные грузить на клиента, а потом с ними работать
0
|
|
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
|
| 05.04.2011, 12:22 [ТС] | |
|
Спасибо!
Пару минут назад сам это обнаружил, (для таких же чайников как я), дословно... 'The fact that the Connection property returns a Connection object that uses the Microsoft Data Shaping Service for OLE DB does have certain consequences: = Recordset objects always use the client-side cursor engine (CursorLocation=adUseClient). Even if you set the CursorLocation property of a Recordset object to adUseServer prior to creating a Recordset object by using the Execute method of a Connection object, the Execute method of a Command object, or the Open method of a Recordset object, you will always get a client-side cursor. = Recordset objects always use a Static cursor (CursorType=adOpenStatic), regardless of what you set the CursorType property to when opening the Recordset object. = You can set the LockType property of a Recordset object to the adLockOptimistic, adLockBatchOptimistic, or adLockReadOnly constants. If you set the LockType to adLockPessimistic, it gets converted silently to adLockOptimistic. As with Recordset objects created with other connections, if you don't specify the LockType property, it will be set to adLockReadOnly by default. = A Connection object established by using the Microsoft Data Shaping Service for OLE DB doesn't support all ADOX operations that a Connection object established by using a direct connection through the Microsoft OLE DB Provider for SQL Server would provide. In particular, operations on the Properties collection of the Column object are not supported. = The Properties collection of a Connection object doesn't support the same properties as a direct connection. For example, the DBMS Version property is not supported. = If the CommandType property of a Command object isn't specified, the connection will not try again to open the Command object as a table if the CommandText property doesn't refer to a stored procedure.'
0
|
|
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
|
| 05.04.2011, 12:37 [ТС] | |
|
Да, блин, облажался я... Вот вам у удобство юзания SHAPE'ов!!!
Переделывать теперь уже нет времени. Буду так с ними и работать. Правда, надо теперь продумать как бы юзвери друг другу данные не попортили. Мысли такие: перед изменениями/добавлениями/удалениями записей слать на сервер запросы (через другое соединение) на проверку существования такой записи. Т. е. вручную синхронизировать локальную базу и сетевую... Как думаете?
0
|
|
|
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 7
|
|
| 05.04.2011, 12:52 | |
|
Синхронизировать не надо. Надо просто предусмотреть ситуацию типа 'save conflict exception' - это когда один юзер запись редактировал/удалил, а другой пытается сохранить поверх. Как способ реализации могу предложить завести в базе в таблицах документов поле int version, которое будет инкрементироваться каждый раз, когда документ апдейтится. (И сеттиться в -1 когда документ удаляется - для софт делита). Если пользовательский документ имеет version отличный от серверного, то это save conflict. Просто нарисовать мессагу и все.
Так например Лотус делает и это считается нормальным.
0
|
|
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
|
| 05.04.2011, 14:11 [ТС] | |
|
2 om600: OK, подумаю на вариантом а-ля Lotus...
Контроль версий (прямо CVS какой-то :-)) поможет при одновременном изменении одной записи несколькими пользователями. Чем плох мой вариант (при условии что ситуаций одновременного изменения /правки/ записи почти не будет - прога для ЗАПОЛНЕНИЯ БД)? Одновременное добавление/удаление можно проверять простым наличием/отсутствием самой записи... Короче, надо прикинуть, что дороже... и, кстати, посмотреть поведение recordset при update/delete - обновляется только локальная копия и при requery сетевая, или сразу обе. Во втором случае пренебрегая 'одновременным изменением' можно просто отлавливать ошибку. Правда там еще всякая бяка будет с полями autoincreament З.Ы. Топик разросся сильно - вот что происходит когда не знаешь как правильно вопрос задать... Насчет пренебрежения 'одновременным изменением' - понимаю, что это не профессиональный подход, но результаты требуют уже вчера, надо хоть что-то показать... :-(
0
|
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 05.04.2011, 15:09 | |
|
попробуй заюзать AdFilterConflictingRecords в фильтре после попытки пакетного апдейта записей
0
|
|
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
|
| 05.04.2011, 15:50 [ТС] | |
|
2 Konst_one: все пытаюсь добраться до этого этапа :-)
борюсь с SHAPE'ом - он даже на локальной копии БД не очень хочет обновлять записи: 1 SHAPE'ом забираются данные при первой загрузке с сервера 2 Работаем с отсоединенной базой (или, скорее, с отсоединенной SHAPE-структурой) 3 При обновлении/удалении ADO посылает соответтствующие запросы на сервак (сам) - на этом этапе и надо будет отслеживать конфликты. ПРОБЛЕМА: есть двa command'a, у каждого подчиненный recordset делает выборку из одной и той же таблицы БД. Например, есть таблицы поставщиков и клиентов, есть таблица соответствия между ними. Поставщики, клиенты - родительские recordset'ы в DataEnvironment, к каждому из них подсоединена таблица их связи как дочерний рекордсет. При добавлении связи через подчиненный recordset Поставщиков, подчиненный recordset связей у Клиентов не меняется. (поэтому я и говорил, что похоже работа идет не с локальной копией БД, а с SHAPE-'снимками')А запрос к сетевой БД делать долго. Как это обойти? Может работал кто тесно с SHAPE'ами? Может надо в DataEnvironment добавить все оригинальные таблицы базы, и все многоэтажные command'ы уже к ним крепить?
0
|
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 05.04.2011, 16:00 | |
|
Я вообще никогда не пользуюсь Dataenvironment
делаю все сам или в модуле или в классах в твоем случае даже не знаю, что посоветовать
0
|
|
| 05.04.2011, 16:00 | |
|
Помогаю со студенческими работами здесь
28
Оптимизация скорости работы жесткого диска. Не знаю ни чего по этой теме,нужно выступить с докладом
Оптимизация скорости загрузки
Оптимизация скорости выполнения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|