2012-06-04 4 views
0

EDIT: я прочитал немного больше по этой теме и понял, что contrary to what is suggested, я просто включаю тот же .sdf-файл, который я создаю для настольного приложения с мобильным. Поскольку кажется, что форматы индексов различаются между рабочим столом/мобильным телефоном (я прочитал предупреждения о первом подключении к базе данных, которые занимают гораздо больше времени, поскольку индексы перестраиваются, если это делается here), и я открываю базу данных как прочитанную только из установочной папки, это то, что двигатель полностью игнорирует мои индексы, поскольку он не может их преобразовать?WP7 оптимизация запросов SQL Server CE

У меня есть 3.5 баз данных SQL Server CE с одной таблицей, Entities, около 146000 строк и столбцов: Id (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000) и индексов на Gloss и Glosslen. Это используется кросс-платформенным приложением, которое я разрабатываю для Windows (WPF) и WP7.5.

Затем я выполнить следующий запрос к базе данных с помощью LINQ к SQL:

(from d in Entities 
where d.Gloss.StartsWith("searchstring") 
orderby d.GlossLen ascending 
select new 
     { Id = d.Id, WrittenForms = d.Gloss, MeaningsString = d.Meaning, 
      MatchString = d.Gloss, MatchStringLen = d.GlossLen }).Take(200) 

Проблема заключается в том утра облицовочный является то, что, в то время как запрос выполняется на разумной скорости (2 секунды или меньше) в Windows, это становится болезненно медленным (6+ секунд) на реальном устройстве WP7 (эмулятор работает почти так же быстро, как WPF).

Насколько я вижу, сгенерированный SQL кажется разумным: ниже возвращается LINQPad.

SELECT TOP (200) 
    [t0].[Id], [t0].[Gloss] AS [WrittenForms], [t0].[Meaning] AS [MeaningsString], 
    [t0].[GlossLen] AS [MatchStringLen] 
FROM [Entities] AS [t0] 
WHERE [t0].[Gloss] LIKE @p0 
ORDER BY [t0].[GlossLen] 

план выполнения запросе, как сообщает Visual Studio является: Индекс Seek-> Filter-> Sort-> Select, так что я не делаю сканирование таблицы.

Я также уже пробовал использовать CompiledQuery.Compile по запросу LINQ, сохраняя сгенерированный Func для повторного использования, но не видел улучшения.

Что я делаю неправильно? Единственное различие между кодами WP7 и WPF заключается в том, что база данных WP7 открывается из установочной папки только для чтения.

+0

Нет, если индексы требуют перестроить, вы получите ошибку. Проблема с индексом относится к Windows Mobile, а не к телефону – ErikEJ

ответ

0

Вы не делаете ничего плохого, но WP7! = Windows. У меня была аналогичная проблема, вызванная слишком широким индексом, я создал столбец только с 1-м 12 символами, индексировал и искал.

+0

Ouch. Не знаю, почему телефон не дает прямого доступа к движку SQLCE, так как этот запрос может быть улучшен на порядок, избегая обработки запросов и прямой таблицы. – ctacke

+0

Что такое хороший размер для индексированных столбцов текста? Могу ли я уйти, скажем, с nvarchar (100), или это будет слишком большим? – lollercoaster

+1

Тест, тест, тест .... Ctake: для INSERT, UPDATE и DELETE процессор запросов обходит, если вы используете столбец rowversion - см. Мой блог – ErikEJ