понедельник, 28 мая 2012 г.

Медленное открытие базы данных MS SQL CE в первый раз

Как я уже писал, я занимаюсь разработкой под мобильные платформы на базе MS WindowsCE. Часто программные решения работают с файловой базой данных MS SQL CE. Недавно в одном из решений возникла проблема при открытии достаточно объемной базы (>100 Мб). Причина оказалась неочевидной.

Суть работы приложения заключается в следующем. Приложение на терминале с WindowsCE 6.0 (для определенности) по сокету соединяется с серверной частью решения (обычное десктопное приложение). В момент подключения на сервере динамически генерируется файл базы данных *.sdf, который сразу же заполняется данными, и отправляется на терминал. И вот тут возможны два варианта развития проблемы, которые приводят примерно к одному и тому же плачевному результату - к тормозам при работе с полученным файлом базы данных. Природа этих проблем разная. Рассмотрим каждую из них.

Случай 1. Файл базы данных создавался в системе с отличным от WindowsCE значением NLS-параметра

Другими словами, проблема возникает, когда файл создавался на одной платформе, а используется на другой. Причина этого заключается в том, что для индексование текстовых колонок используется LCMapString API, поведение которого зависит от версии NLS. Скажем, для Windows XP и Windows 7 значения NLS разные. А вот для Windows XP и WindowsCE 6.0 - значения одинаковые.  Поэтому если файл создавался на сервере под управлением Windows XP, то проблем не будет, а если под Windows 7 - при первом соединении с базой SQL Compact Edition будет мучительно долго "переделывать" файл базы. При размере базы более 100 Мб у меня этот процесс выполнялся более 15 минут.

Решения этой проблемы у меня пока нет. Единственное, что можно сделать - взять уже созданный файл базы данных (как описано тут), а не создавать базу через SqlCeEngine.

Интересно, что описанная проблема может не возникать вообще.

Случай 2. Проблема с NLS обошла стороной, но при первом обращении к таблицам с индексами опять-таки происходит зависание

Природа этого случая заключается в следующем: когда на сервере происходит заполнение базы данные (при помощи выполнения самых обычных запросов INSERT) не происходит перестроение индексов (!). В результате, построение индексов происходит при первом обращении к ним. Соответственно, при больших объемах данных и небольших ресурсах терминалов под управлением WindowsCE процесс обращения к таблице с индексами вновь скаченной базы затягивается на долгие минуты.

Решение, которое получилось реализовать более-менее дешевым способом, стало обращение ко всем таблицам с индексами прямо на стороне сервера сразу после того, как завершен процесс заполнения данными. А так как сервер все-таки побогаче в плане ресурсов, этот процесс занимает пару секунд.

Итого

В заключение хочется отметить одну странность: почему-то в некоторых проектах у меня не возникали описанные проблемы, хотя подход использовался один и тот же. Поэтому желаю, чтобы эти проблемы возникали как можно реже.

Ссылки по теме:

Комментариев нет:

Отправить комментарий