0

编辑:我已经阅读了有关该主题的更多内容,并意识到,与建议的相反,我只是将我为桌面应用程序生成的相同 .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 开发的跨平台应用程序使用。GlossGlosslen

然后我使用 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 数据库是以只读方式从安装文件夹打开的。

4

1 回答 1

0

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

于 2012-06-04T11:23:07.583 回答