Windows Phone 7模拟器中的多对多查询运行速度很慢

时间:2011-07-21 12:18:44

标签: sqlite windows-phone-7 many-to-many

我的应用程序使用sqlite作为数据库。在数据库中,我有多对多的关系。当我使用sqlite addon / tool for firefox时,加入多对多运行中的表的sql查询运行速度非常快。但是,当我在模拟器上运行相同的查询时,需要很长时间(5分钟或更长时间)。我甚至没有在真实设备上试过它。

有人可以告诉我发生了什么吗?

例如,我有3个表。 1.创建表人(id整数,名称文本); 2.创建表课程(id integer,name text); 3.创建表注册(personId integer,courseId integer);

我尝试的sql语句如下。

select * 
from person, course, registration
where registration.personId = person.id and registration.courseId = course.id

以及如下。

select *
from person inner join registration on person.id=registration.personId
inner join course on course.id=registration.courseId

我正在使用http://wp7sqlite.codeplex.com中的sqlite客户端。我在注册表中有4,800条记录,在person表中有4,000条记录,在课程表中有1,000条记录。

是我的疑问吗?它只是sqlite客户端?是记录大小?如果这个问题无法在应用程序上修复,我担心我将不得不远程推送数据库(这意味着我的应用程序必须使用互联网)。

2 个答案:

答案 0 :(得分:2)

是的,这是你的疑问。你不会侥幸逃脱,你可以逃避在移动设备上做你想做的事情。你必须记住你没有在PC上运行,所以你必须对你如何处理事物(包括代码和UI)有不同的看法。您的内存不足,磁盘访问速度慢,处理器速度慢,没有虚拟内存等等。您将不得不妥协。

我确信你所做的一切都是完全可以在手机上完成而不需要非现场服务器,但你需要聪明一点。例如,是否真的有必要一次将所有4800+记录加载到内存中?几乎可以肯定的是,用户不可能同时查看所有4800。忘记在ListBox中显示此项目数量的数据库速度将明智地破坏您的应用程序性能。

即使是性能完美显示4800项真的很好的用户体验?当然允许用户输入搜索词会更好,并允许您将列表过滤到更易管理的大小。你能实现分页,所以你只显示前10条记录并让用户点击下一个10的下一个记录吗?

您可能还想考虑对数据库进行反规范化,这样您只需要一个表而不是3个。这将大大提高性能。是的,它违背了你在学校教授数据库的所有内容,但就像我说的那样:电话=妥协。请记住,这不是一个很大的OLTP任务关键数据库,它是一个手机应用程序 - 没有人关心您的数据库是否处于第3范式。还要记住,你给手机提供的工作量越多(通过数据建立连接),你的应用就会消耗更多的电池电量。

最后,如果您绝对认为必须向用户提供要滚动的4800条记录的列表,那么您应该看一下某种数据虚拟化技术。即使实际上在任何给定时间只加载了几个项目,它也会让用户产生滚动浏览长列表的错觉。

但简短的回答是:是的,做这样的查询会有问题,你需要考虑改变它们。

答案 1 :(得分:1)

当你开始做这些连接时,你可能最终得到了大量的记录。这次行动中的记忆是什么?

假设您已经适当地调整了索引,而不是使用连接进行此操作,我会尝试三个单独的查询。

或者考虑重构您的数据,使其仅包含您在应用中所需的内容 您还应该只返回所需的字段。