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 открывается из установочной папки только для чтения.
Нет, если индексы требуют перестроить, вы получите ошибку. Проблема с индексом относится к Windows Mobile, а не к телефону – ErikEJ