WP7 SQL Server CE查询优化

时间:2012-06-04 10:44:34

标签: windows-phone-7 linq-to-sql sql-server-ce

编辑:我已经阅读了更多有关该主题的内容,并且已经意识到,contrary to what is suggested,我只是包含了我为移动台桌面应用程序生成的相同.sdf文件。因为看起来桌面/移动设备之间的索引格式不同(我已经阅读了有关第一个数据库连接的警告,因为如果完成了重建索引需要更长时间here)并且我打开数据库只读取安装文件夹,可能是引擎完全忽略了我的索引,因为它无法转换它们吗?

我有一个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开发的跨平台应用程序使用的。

然后,我使用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报告的查询执行计划是:索引搜索 - >过滤器 - >排序 - >选择,所以我没有进行表扫描。

我还尝试在LINQ查询中使用CompiledQuery.Compile,将生成的Func存储起来以便重复使用,但是没有看到任何改进。

我做错了什么? WP7和WPF代码路径之间的唯一区别是WP7数据库是从只读的安装文件夹中打开的。

1 个答案:

答案 0 :(得分:0)

你没有做错什么,但WP7!= Windows。我有类似的问题,由于索引太宽,我创建了一个只包含前12个字符的列,并对其进行索引和搜索。