优化笨拙的查询

时间:2012-02-26 11:59:48

标签: sql ms-access

我在一所学校工作,并建立了一个数据库来帮助检查哪些孩子去过哪些课后俱乐部的噩梦。

我试图通过构建数据库来尝试这样做,该数据库使用链接表从42个寄存器(excel文档)中的每一个中提取。然后,我设置了几个查询,从特定表格中搜索学生,然后我生成一个报告,以便每个表格组可以查看他们表格中的孩子是否在特定的一周内去了俱乐部。

我对SQL的了解很基础:我可以编写查询来做各种事情,但不知道如何优化大型查询。

我遇到的问题是每个报告生成2分30秒现在我已经将所有42个寄存器添加到查询中。之前,当我只有31时,报告会在30秒内生成。

以下是查询示例:

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [club 1]
WHERE ((([Club 1].[Group])="group name"))

UNION ALL 

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [club 42]
WHERE ((([Club 42].[Group])="group name"));

查询在初始UNION ALL SELECT之后有41个SELECT,并且很可能是最有效的,令人眼花缭乱的严重错误的查询,但正如我所说,我对SQL的了解是基本的,而我我正在学习。

更多信息: 这些登记册上有480名学生,一名学生可以在一周内访问一个以上的俱乐部,因此查询将需要查找学生参加过俱乐部的每个实例。

使用Access with Excel之外的选项非常非常有限。我曾与一些朋友交谈,看过MySQL方法,并在网络上设置本地服务器,但我们的网络是一个manged服务,管理它的公司至少可以说是在他们的服务器上设置这样的东西(可以理解的。)

我想,对于我需要的东西,这可能是唯一的方法,并且查询花费2分30秒比每周五通过manaully检查每个寄存器花费的30分钟更好。我试图对此进行排序的原因是:

A)我想进一步扩展我的编程知识,并且到目前为止,设法错过了SQL
B)访问数据库的教师经常不耐烦,在加载报告时随机点击,试图让它更快地工作或者出于挫折感,经常会崩溃Access

3 个答案:

答案 0 :(得分:3)

我的建议是不是每个俱乐部都有一张桌子,而是只有一张桌子附加一列[Club_Name]或一张ID,以便稍后将结果加入俱乐部桌子。

这样查询就像:

SELECT [UID], [Name], [Group], [Club_Name], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [Clubs]
WHERE ((([Clubs].[Group])="group name"));

你认为有可能这样做吗?

答案 1 :(得分:1)

你遇到的根本问题是你从42个不同的来源中提取数据,这最终是一种尴尬的机制。这不是你做错的事情,只是给你的Excel访问系统架构,这只是生活中的事实。

如果您网络上的用户拥有使用Access的许可,那么您可以将42个Excel电子表格替换为用户以共享模式连接的单个Access数据库。将所有数据保存在一个表中而不是42个外部链接数据源中,可以为您生成报告提供亚秒响应时间。

回到VB3的heydey,我构建了VB和Access应用程序,这些应用程序由许多人通过网络共享。您的网络提供商不可能反对存储在其服务器上的单个文件。

如果您的用户没有使用Access的许可,那么您可以为共享Access数据库创建一个简单的ASP.NET前端。

一旦您决定迁移到单个共享数据库,您还应确保数据库的设计已规范化,以便您的查询简单高效,并且您的数据维护代码可以很简单。不要考虑电子表格设计!如果您打算走这条路线并需要有关架构设计的建议,请发表评论告诉我。

答案 2 :(得分:0)

您的基本问题是您正在尝试针对可怕的数据库编写好的查询。

如果所有42个俱乐部提供有关学生的相同数据,那么它们都应该在同一张桌子上。应该有一个额外的栏目,“ClubId”来指示数据属于哪个俱乐部。为了使ClubId有意义,必须是俱乐部的表格,有关俱乐部的数据,如俱乐部的名称。此表有一个名为“Id”的列,它为您的考勤表中的ClubId提供参考点。

除了上述设计之外,还有更好的设计,但这比你现在的要领先一步。

了解如何将从excel寄存器中获取的表合并到一个表中。了解如何使用联接将来自寄存器的数据与关于球杆的数据相结合。写一个好的查询。使用您的数据量需要几秒钟。