编辑:我已经阅读了一些关于这个主题,并已经意识到,contrary to what is suggested,我只是包括我为移动的桌面应用程序生成相同的.sdf文件。由于似乎桌面/移动设备上的索引格式不同(我已经阅读了有关第一次数据库连接的警告,因为索引已重建,如果这样做已完成here)并且我将数据库作为只读从安装文件夹打开,可能会这是引擎完全忽略我的指数,因为它不能转换它们?WP7 SQL Server CE查询优化
我有一个SQL Server CE 3.5数据库,其中有一个表Entities
,它有大约146,000行,这些列是:Id (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000)
,以及Gloss
和Glosslen
上的索引。这是由我正在为Windows(WPF)和WP7.5开发的跨平台应用程序使用的。在Windows
(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秒或更少),它:
然后我使用LINQ to SQL对数据库运行下面的查询在实际的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执行计划是:指数Seek->过滤器 - >排序 - >选择,所以我没有做一个表扫描。
我也已经尝试在LINQ查询中使用CompiledQuery.Compile
,存储生成的Func以供重用,但没有看到任何改进。
我在做什么错? WP7和WPF代码路径唯一的区别在于WP7数据库是从安装文件夹以只读方式打开的。
不,如果索引需要重建,你会得到一个错误。索引问题涉及Windows Mobile,而不是Phone – ErikEJ