2012-06-04 99 views
0

编辑:我已经阅读了一些关于这个主题,并已经意识到,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),以及GlossGlosslen上的索引。这是由我正在为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数据库是从安装文件夹以只读方式打开的。

+0

不,如果索引需要重建,你会得到一个错误。索引问题涉及Windows Mobile,而不是Phone – ErikEJ

回答

0

你没有做错任何事,但WP7!= Windows。我有类似的问题,由索引过宽造成,我创建了一个只有前12个字符的列,并对其进行索引和搜索。

+0

Ouch。不知道为什么电话不直接访问SQLCE引擎,因为通过避免查询处理器和直接进入表格,可以将该查询提高一个数量级。 – ctacke

+0

那么索引文本列的大小是多少?我可以避开nvarchar(100),还是会变得太大? – lollercoaster

+1

测试,测试,测试.... Ctake:对于插入,更新和删除,如果您使用rowversion列,查询处理器将被绕过 - 请参阅我的博客 – ErikEJ