编辑:我已经阅读了有关该主题的更多内容,并意识到,与建议的相反,我只是将我为桌面应用程序生成的相同 .sdf 文件包含在移动应用程序中。由于桌面/移动设备之间的索引格式似乎不同(我已经阅读了有关第一个数据库连接的警告,因为如果在此处完成索引会重建索引,则需要更长的时间)并且我从安装文件夹中以只读方式打开数据库,可以是引擎完全忽略了我的索引,因为它无法转换它们吗?
我有一个带有单个表的 SQL Server CE 3.5 数据库Entities
,有大约 146,000 行和这些列: ,以及 和 上的Id (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000)
索引。这由我正在为 Windows (WPF) 和 WP7.5 开发的跨平台应用程序使用。Gloss
Glosslen
然后我使用 LINQ to 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)
我面临的问题是,虽然查询在 Windows 中以合理的速度(2 秒或更短)执行,但在实际的 WP7 设备上它变得非常慢(6 秒以上)(模拟器几乎与 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 报告的查询执行计划是:Index Seek->Filter->Sort->Select,所以我没有进行表扫描。
我也已经尝试CompiledQuery.Compile
在 LINQ 查询上使用,存储生成的 Func 以供重复使用,但没有看到任何改进。
我究竟做错了什么?WP7 和 WPF 代码路径之间的唯一区别是 WP7 数据库是以只读方式从安装文件夹打开的。