我有一个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开发的跨平台应用程序使用的。
然后,我使用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数据库是从只读的安装文件夹中打开的。
答案 0 :(得分:0)
你没有做错什么,但WP7!= Windows。我有类似的问题,由于索引太宽,我创建了一个只包含前12个字符的列,并对其进行索引和搜索。