Как я уже писал, я занимаюсь разработкой под мобильные платформы на базе 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 процесс обращения к таблице с индексами вновь скаченной базы затягивается на долгие минуты.
Решение, которое получилось реализовать более-менее дешевым способом, стало обращение ко всем таблицам с индексами прямо на стороне сервера сразу после того, как завершен процесс заполнения данными. А так как сервер все-таки побогаче в плане ресурсов, этот процесс занимает пару секунд.
Итого
В заключение хочется отметить одну странность: почему-то в некоторых проектах у меня не возникали описанные проблемы, хотя подход использовался один и тот же. Поэтому желаю, чтобы эти проблемы возникали как можно реже.
Ссылки по теме:
- http://blogs.msdn.com/b/sqlservercompact/archive/2009/04/01/after-moving-the-database-from-one-platform-to-other-the-first-sqlceconnection-open-takes-more-time.aspx
- http://erikej.blogspot.com/2009/08/running-sql-compact-from-cd-rom-read.html
- http://social.msdn.microsoft.com/Forums/en/sqlce/thread/40d9e654-d392-49be-951a-b673a339c483
- http://connect.microsoft.com/SQLServer/feedback/details/592059/allow-selection-of-nls-sort-algorithm-in-sql-server-compact-indexes
Комментариев нет:
Отправить комментарий