数据报表运行速度狂慢,寻求好方法以提高程序性能!

kinmax 2005-08-17 03:55:51
前几天我在CSDN里提了个问题,请教高手帮忙做个报表,现在问题基本已经解决,现在碰到的问题是程序运行的速度很蛮,一万条不到的记录,需运行1分钟左右的时间。不知道有什么方法可以提高程序的运行效率,特请教。

原始贴子联结如下:http://community.csdn.net/Expert/topic/4206/4206056.xml?temp=.9261896

我是采用aw511(点点星灯)朋友提供的方法来做的,可以实现预期目的,并且运行速度也可以忍受。但问题是,用那种方法取出来的数据是每日汇总数据,而我要的是每月的汇总数据。我把每日的汇总数据取出来后,放在数组里,然后通过循环用SQL语句来判断数据是否存在,如果存在则更新数据,否则,数据插入。在这中间,就会大量涉及到数据库的联结和查询、更新及数据插入操作,比较耗时,不知道有哪位高手能帮我想个好的办法,最好能用一条SQL语句直接取出我想要的数据,那就不需要我频繁的去判断并操作数据库了。

我的SQL语句如下:

SELECT * FROM (
SELECT b.sTorihikisakicd,sKyaku=a.sKyaku0,dcKyakuKin=a.dcKyakuKin0,dcSyohiKin=a.dcSyohiKin0
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku0 between '20020800' and '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku1,dcKyakuKin=a.dcKyakuKin1,dcSyohiKin=a.dcSyohiKin1
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku1 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku2,dcKyakuKin=a.dcKyakuKin2,dcSyohiKin=a.dcSyohiKin2
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku2 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku3,dcKyakuKin=a.dcKyakuKin3,dcSyohiKin=a.dcSyohiKin3
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku3 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku4,dcKyakuKin=a.dcKyakuKin4,dcSyohiKin=a.dcSyohiKin4
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku4 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku5,dcKyakuKin=a.dcKyakuKin5,dcSyohiKin=a.dcSyohiKin5
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku5 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku6,dcKyakuKin=a.dcKyakuKin6,dcSyohiKin=a.dcSyohiKin6
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku6 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku7,dcKyakuKin=a.dcKyakuKin7,dcSyohiKin=a.dcSyohiKin7
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku7 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku8,dcKyakuKin=a.dcKyakuKin8,dcSyohiKin=a.dcSyohiKin8
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku8 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku9,dcKyakuKin=a.dcKyakuKin9,dcSyohiKin=a.dcSyohiKin9
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku9 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL
UNION ALL SELECT b.sTorihikisakicd,sKyaku=a.sKyaku10,dcKyakuKin=dcKyakuKin10,dcSyohiKin=a.dcSyohiKin10
FROM bmgnb10 a LEFT JOIN T_DMTORIHISAKISAKI b ON ltrim(rtrim(a.sOdrNcd))=LTRIM(RTRIM(b.sOdrNcd)) WHERE a.sKyaku10 BETWEEN '20020800' AND '20050899' AND b.sTorihikisakicd IS NOT NULL) t
GROUP BY t.sTorihikisakicd,t.sKyaku,t.dcKyakuKin,t.dcSyohiKin order by t.sKyaku desc

SQL语句仅供参考。

查询结果:
sTorihikisakicd sKyaku dcKyakuKin
0 2005 131 841000 42050
0 2005 131 860000 43000
0 2005 131 878000 43900
0 2005 131 883500 44175
0 2005 131 886000 44300
0 2005 131 888000 44400
0 2005 131 909500 45475
0 2005 131 910000 45500
0 2005 131 933000 46650
0 2005 131 950000 47500
0 2005 131 963500 48175
0 2005 131 991500 49575
0 2005 131 1040000 52000
0 2005 131 1050000 52500
0 2005 131 1080000 54000
0 2005 131 1120500 56025
0 2005 131 1150000 57500

……………………………….省略
...全文
142 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
swordmanli 2006-01-02
  • 打赏
  • 举报
回复
http://www.blog.com.cn/user25/lijunyi/archives/2005/213533.shtml
kinmax 2005-08-17
  • 打赏
  • 举报
回复
自己顶一下

理解Microsoft专家认证程序 理解Microsoft认证的不同等级和类型 选择成为MCP(Microsft认证专家)的考试科目 选择成为MCSD的考试科目 选择成为MCT的考试科目 MCSE认证考试的科目 选择合适的MCSE课程组合 核心课程考试 选修课程考试 考试编号的识别 课程内容和考试内容的对照 理解微软的MCSE长远考虑 理解微软出题的方式 使用本书帮助备考 在Internet上寻找对考试有帮助的信息 寻求微软认可的课程指导 寻找高质量的和三方帮助 寻找可利用的评估软件拷贝 报名参加考试 考试的费用问题 考前的自我调整 使用考试中心提供的考试工具 参加模拟测试 熟悉使用计算机进行考试 充分利用考试时间 考题的形式 理解多重选择题型 理解对错题题型 理解多重选择多重答案题型 理解基于解决方案型的问题 理解“建议方法”类型的考题 分析考试结果 准备重新考试 合理安排考试课程的顺序 熟悉Windows系列产品 比较Windows NT Server和NT Workstation 比较Windows NT Workstaton和Windows 95 在Windowx 95和Windows NT Workstation之间作出选择 关于Microsoft Windows NT的70-069号考试:实现和支持Microsoft Windows NT Server 4.0 70-069号考试(实现和支持Microsoft Windows NT Server 4.0)覆盖的内容 Windows NT 4.0界面简介 Windows NT 4.0任务栏(taskbar)的使用 Windows NT回收站简介 Windows NT帐号简介 理解单域模型支持和帐号数量 安全认证号简介 使用管理向导(Administrative Wizards)创建帐号 使用Server Manager(服务器管理器)程序创建计算机帐号 Userver Manager for Domains(域的用户管理器)简介 使用User Mnager for Domains创建用户帐号 刷新用户帐号列表 用户帐号列表的排序 事件查看器(Event View)程序简介 筛选Event Viewer中的事件 授予用户在本地登录的权利 使用Windows NT诊断程序查看系统配置 激活“Windows NT Security(Windows NT安全)”对话框 理解登录验证过程 理解访问令牌(Access Token) Windows NT目录服务简介 理解Windows NT如何构造用户帐号数据库 使用Windows NT中的Ctrl+Alt+Del组合键 把Windows NT计算机设置成自动登录 改变Windows NT口令 用拨号网络登录 复制用户帐号 为简化多个帐号的创建工作而建立用户帐号模板 删除和重新命名用户帐号 理解保护缺省的Administrator帐号的重要性 重新命名管理员帐号 理解缺省的Guest帐户 Windows NT在哪里创建帐号 设置口令限制条件 设置用户登录地点 创建宿主文件夹 设置用户登录时间 创建临时用户帐号 重新设置用户帐号口令 修改多个用户帐号 自动注销有时间限制的用户 要求用户在下次登录时改变口令 设置帐号规则 设置用户口令永不过期 停用用户帐号 解开登录失败后的用户帐号 Windows NT组简介 理解用户权限和组的访问权限 理解用户和组的权利 分清权限(permission)和权利(right) 设置组成成员关系 理解全局帐号 理解本地帐号 定义Everyone组 Network组的详细说明 Inteactive组的详细说明 Administrators组的详细说明 Guest组的详细说明 Users组的详细说明 Print Operators组的详细说明 Backup Operators(帐户操作员)组的详细说明 Replicator(复制员)组的详细说明 Domain Guests(域客户)组的详细说明 Domain Users(域用户)组的详细说明 Domain Admins(域管理员)组的详细说明 赋予拨号进入权限 理解用户配置文件(User Profile) 为Windows用户创建并使用登录脚本文件(Logon Script) 创建漫游式用户配置文件(Roaming User Profile) 创建强制性用户配置文件(Mandatory User Profile) 为用户帐号分配一个配置文件 创建帐户时变量的使用 创建随机初始化口令 理解内建组(Built-in Group) 理解组和策略 设置主组(Primary Group) 理解删除一个组的影响 域控制器(Domain Controller)简介 成员服
一.系统模块的实现 在系统中包括以下功能:系统管理、学籍信息管理、课程信息管 理、成绩信息管理、帮助。分为以下几个模块 主窗体 标 题 名 称 系统管理 sysMenu ……用户管理 Control ……退出系统 Exit 学籍管理 sInfo 课程管理 cInfo 成绩管理 rInfo 帮助 help ……使用说明 howto ……关于 about 1.1登录模块 为了系统的安全,在进入系统之前首先会出现一个登录模块,用户只有在输入正确的用户名和正确的密码之后,才能进入系统。 用户登录窗体中放置了两个文本框(Textbox),用来输入用户名和密码;两个按钮(CommandButton)用来确定或者取消登录。 设置一个SSTab控件,供不同用户登录时选择用户权限,超级用户拥有一切权限(包括添加删除和修改以及对用户的管理),普通用户拥有受限制的权限(查询及修改密码),提高数据库的安全性。 1.2系统管理模块 1.2.1添加用户窗体的创建 进入系统后,将会出现一个主窗体,选择系统管理模块下的添加用户,就可以进入添加用户窗体,可以通过该窗体增加新的用户。 在这个窗体中放置了三个文本框,用来输入用户名和密码;两个按钮用来确定是否添加用户;三个标签用来标示文本框的提示。 1.2.2修改密码窗体的创建 在系统管理模块下,进入修改密码窗体,用户可根据需要修改自己的密码。 在这个窗体中放置了两个文本框,用来输入密码和确认密码;两个按钮用来确定是否修改密码;两个标签用来标示文本框的内容。 1.3学籍管理模块 1.3.1添加学籍信息功能 选择主窗体中学籍管理模块下的添加学籍信息,就可进入添加学籍信息的窗体,在该窗体中我们可以对学生的学号、姓名、性别、出生日期、班号等学生的信息进行添加。设计时我尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,当输入的信息满足这些边界条件时,将会弹出一个提示框提醒用户,以便用户能及时地做出修改。添加的信息将全部存储到数据库中。 在窗体上放置多个文本框和下拉式文本框,用来输入学籍信息;两个按钮用来确定是否输入学籍信息;一个按钮用来退出窗体;多个标签用来提示文本框中需要输入的内容。 1.3.2修改学籍信息功能 点击学籍管理模块下的修改学籍信息,就进入修改学籍信息的窗体,在该窗体中我们可以对前面添加的学籍信息进行修改。由于用户的需求不同,有的是要对学生的信息做个别的改动,有的是需要删除该条记录,所以该窗体同时包括了修改记录的功能和删除记录的功能。又考虑到用户的误操作,为了方便,我在该窗体中增添了取消修改的功能,可一次性把输入文本框的内容全部置空。 1.3.3查询学籍信息功能 进入学籍管理模块下的查询学籍信息窗体,在该窗体中可以对学生的信息进行查询,有三种查询方式。我在设计时,一方面考虑到简洁的因素,用户可以只设置一种查询方式进行查询;另一方面又为了避免数据的重复,用户可以输入详细的信息,也就是同时设置多种查询方式进行查询。进入查询窗体时,myflexgrid中会显示出所有学生的学籍信息,如果不设置查询方式就进行查询,是无效查询,系统会给出提示。在设置好查询方式后,便开始查询,将在myflexgrid中显示出用户所需的学生的学籍信息。 1.4课程管理模块 1.4.1课程信息浏览功能 点击主窗体中课程管理模块下的课程信息浏览,可进入课程信息浏览窗体。为了用户的使用方便,我使用了SSTab控件,故在该窗体中同时包含了课程信息的添加和修改的功能。并且我还在窗体上设置了myflexgrid控件。添加和修改记录后,对于数据有何变化都可以在myflexgrid中显示出来,使用户对所做的操作一目了然。 1.4.2年级课程设置功能 进入课程管理模块下的年级课程设置窗体,可以对每一个年级的课程进行设置。 1.5成绩管理模块 1.5.1成绩信息管理功能 点击成绩管理模块下的成绩信息浏览,进入成绩信息浏览窗体,考虑到美观和实用性,界面设置如下图。用Frame控件在窗体中划定一个可浏览成绩信息地方,再在Frame中添加MSFlexGrid控件,运行时将在MSFlexGrid中显示所有学生的成绩信息。使用Toolbar来建立工具条。点击工具条中的修改、添加和查询按钮就可分别进入修改成绩信息窗体、添加成绩信息窗体和查询成绩信息窗体。这三个窗体的界面设置分别类似于学籍管理下修改学籍信息窗体、添加学籍信息窗体和查询学籍信息窗体。 1.6其它 操作人员在遇到困难时即可进入帮助菜单寻求帮助。帮助菜单下的“使用说明”将解答你的疑问。帮助菜单下的“关于”详细地列出了关于作者的一些情况,关于版权的一些情况和关于系统的一些情况。进入打印菜单栏,可对你所需要的信息进行打印。 二 系统后期工程 在开发这个软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,在本次设计过程中,我采用循环测试法,力求在每个阶段结束之前通过严格技术审查,即每完成一个功能,就进行测试,尽可能早的发现并纠正差错,完成模块测试之后再进行系统测试。 在该设计中,我偏重考虑了当用户输入的信息出错时,系统就会出现提示,以便让用户知道出错的原因,并能及时做出修改,所以我站在用户的角度考虑,尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,以此来发现错误,纠正错误,取得了一定的效果。 当然,该学生信息管理系统也存在一些不足之处。在成绩管理界面,当3次改变成绩为不同的内容时,程序会出错。虽然尝试了很多方法,仍不能解决。再一点就是关于打印和年级课程信息设置都未能实现,这有待于以后的进一步提高。 一个应用系统性能的优劣,效率的高低始终应当由用户来做出判决,应用系统在运行过程中,用户会提出一些新的需求和建议,我就会根据用户需求的变化,对本系统做出一定的修改,使其进一步地得到完善和提高。 1. 概述 1.1. 目的 为了彻底解决了长期困扰教学信息化工作当中安全性、可靠性的问题;为了使管理人员可以随时看到更新的数据,极大地提高信息传递的速度;为了管理者再也不必为聘用专门的操作人员来给众多教师编辑学生成绩资料而殚精竭虑,在此,设计了学生课程成绩查询管理信息系统,使得各个使用者在操作上,从此变得那么从容简单,省时又省心。 1.2. 参考文档 [1] 张海藩.软件工程导论[M].第4版.北京:清华大学出版社.2007.25-63. [2] 赵洋,张丽,王恩东,李玉红.基于B/S结构学生成绩管理系统设计与实现[J].沈阳化工学院学报.2007,21(2).140-142. [3] 游应德.基于Intemet的学生信息管理系统—学生成绩管理系统[D].电子科技大学.成都:电子科技大学,2007. [4]郑若忠,王鸿武.数据库原理与方法.湖南科学技术出版社.  2. 总体结构设计 2.1. 层次图 2.2结构图 2.3 功能设计 学生成绩单录入部分可以对某一个学生进行成绩录入,但是一次只能录入一条成绩记录,同时可对缺考、免考、补考学生成绩进行录入。 学生成绩显示/修改部分可以对已录入的成绩进行显示和修改,但是只能对系统默认的当前学期的记录进行修改。 学生成绩显示/删除部分可以对已录入的成绩进行显示和删除,但是也只能对系统默认的当前学期的记录进行删除。 2.3. 运行环境设计 2.3.1. 硬件设计 1.服务器: CPU:P4 2.0G以上 内存:512M 硬盘:60G以上 网络:100M /1000M Ethenet 2.客户机: CPU:500Mz 内存:64M以上 硬盘:1G以上 网络:10M Ethenet 2.3.2. 软件设计 1.服务器: 操作系统:Windows 2000/XP/2003 WEB服务:IIS5.0 数据库:SQL Server 2000(建议打Service Pack 3补丁) 2.客户机: 操作系统:Windows系列之一 浏览器:IE6.0以上版本 2.3.3.网络设计 采用sql server2000网络关系型数据库,存储读取数据将同步进行。 3.详细设计 用判定树表示教师端模块 4. 数据结构设计 4.1. 数据分析 第一层:基础数据及基础数据库分析 此类报表主要反映学校教师、学生和课程等的资料情况。 此类报表是将系统中较为常用的学生、教师和课程等基础资料以报表的形式予以反映。 在本层需要设计三个主表,分别用来存储学生资料、教师资料和课程资料。 第二层:业务流程数据及业务流程数据库分析 在编辑此类表单时,可以点击相应的下拉按钮,这时所有的选项资料都会显 来,您可以根据实际情况来编制表单,使整个过程更加清晰,操作更加简便。 在本层需要设计一个学生成绩主表,用来存储学生的平时成绩表。 4.2. 数据库设计 4.2.1. 设计原则 1.密码管理:学生修改学生查询密码;教师可以修改查询密码。 2.每个教师可以查看所有学生的成绩,包括每门课程的成绩、每门课程的平均成绩、每个分数段的成绩。 3.学生根据自己的学号查询本人的成绩。 4.教师可以登记、修改、查询自己所讲授课程的学生的成绩、该课程的总分、平均成绩、各分数段成绩人数统计、不及格学生的名单、成绩等等。 4.2.2. 数据库组成 数据表3个: 学生表(5个字段: xh, xm, xb, csrq, bj),其中有各班学生的记录 课程表(4个字段:kch,kcm, js, xf),其中有课程的记录; 成绩表(3个字段:xh, kch, cj),其中有学生成绩的记录。 学生基本信息表(Student)描述如下: 学生期末成绩表(Grade)描述如下: 学生的课程管理(Course)描述如下: 4.2.3. 面向对象数据库设计方法 1)考虑对象的静态和动态属性 对象属性决定了数据库或包含具有相同类型对象的表的内容。 2)描述数据实体及其属性 包含所有静态属性的单个对象被称作数据实体。每个单独的数据实体必须唯一,这样可以与其他实体区分。包含在数据实体中的对象的性质被称作为属性。(attribute) 3)用方法来说明对象的行为 关系数据库对象的行为决定了数据对象参与事务的特征。事务的发生对应着事件,通过使用响应事件的方法来实现事务。 4)在单个表中合并不同实体 可以在单个表中包含不同对象类型的说明,只要可以按照相同方式描述属性和行为,以及区分不同对象类型即可。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧