编辑:我已经阅读了更多关于这个主题的内容,并意识到,contrary to what is suggested,我只包含了我为桌面应用程序生成的与移动应用程序相同的.sdf文件。由于台式机/移动端的索引格式似乎不同(我读到了关于第一个数据库连接需要更长时间的警告,因为如果这样做,here会重建索引),而且我从安装文件夹中以只读方式打开数据库,会不会是引擎完全忽略了我的索引,因为它不能转换它们?
我有一个SQL Server CE3.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设备上(仿真器几乎和WPF一样快),它变得极其缓慢(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,所以我不是在执行表扫描。
我也已经尝试在LINQ查询上使用CompiledQuery.Compile
,存储生成的Func以供重用,但没有看到任何改进。
我做错了什么?WP7和WPF代码路径之间的唯一区别是从安装文件夹以只读方式打开WP7数据库。
发布于 2012-06-04 19:23:08
你没有做错任何事,但是WP7 != Windows。我也有类似的问题,由于索引太宽,我创建了一个只有前12个字符的列,并对其进行了索引和搜索。
https://stackoverflow.com/questions/10880002
复制相似问题