WP7 SQL Server CE 查询优化

Posted

技术标签:

【中文标题】WP7 SQL Server CE 查询优化【英文标题】:WP7 SQL Server CE query optimization 【发布时间】:2012-06-04 10:44:33 【问题描述】:

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

我有一个带有单个表 Entities 的 SQL Server CE 3.5 数据库,它有大约 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 报告的查询执行计划是:Index Seek->Filter->Sort->Select,所以我没有进行表扫描。

我也已经尝试在 LINQ 查询上使用CompiledQuery.Compile,存储生成的 Func 以供重复使用,但没有看到任何改进。

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

【问题讨论】:

不,如果索引需要重建,你会得到一个错误。索引问题与 Windows Mobile 相关,而不是 Phone 【参考方案1】:

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

【讨论】:

哎哟。不知道为什么电话不直接提供对 SQLCE 引擎的访问权限,因为可以通过避免查询处理器和直接访问表来将这个查询改进一个数量级。 那么索引文本列的合适大小是多少?例如,我可以使用 nvarchar(100) 还是它太大了? 测试、测试、测试...... 好的,我尝试使用 Gloss 设置为 nvarchar(32) 重建数据库,这导致索引更小,但查询执行速度并没有提高。对于这种工作负载,真的有办法让 WP7 获得不错的性能吗?还是我对手机的要求太高了? 尝试不使用 order by 子句

以上是关于WP7 SQL Server CE 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

WP7 SQL Server CE 如何更新

WP7 上 SQL CE 中的事务

在 WP7 上使用 C# 格式化 LINQ SQL CE 数据

SQL Server调优系列基础篇(索引运算总结)

Sql Server中执行计划的缓存机制

加密 SQL Server CE 数据库