祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 6290|回复: 7

[转帖]介绍一些用于提高数据窗口性能的技术

[复制链接]

[转帖]介绍一些用于提高数据窗口性能的技术

[复制链接]
ehxz

主题

0

回帖

58万

积分

管理员

积分
588551
贡献
在线时间
小时
2007-10-10 16:53:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
1.   减少连接数据库的次数  
连库操作是非常影响执行速度的操作.   因此在程序中,一旦与数据库连接后就应当尽量保持与数据库的连接,   减少连接数据库的次数.PowerBuilder   提供里两个函数来建立数据窗口与事务对象的连接:  
                SetTrans()    
                SetTransObject()  
在程序中应当尽量使用   SETTRANSOBJECT(),   因为SETTRANS()   函数在每次调用   RETRIEVE(),   UPDATE()   等函数之后,   都要执行数据库的连接和断开操作.  
2.   下拉数据窗口与表的连接  
        对于数据库服务器来说,   表的连接操作是一项非常大的开销,   而   POWERBUILDER   提供的下拉数据窗口在某些情况下可以代替表的连接操作.例如,   为了在数据窗口上显示用户的电话号码和姓名:如果用表的连接的方法,   数据窗口对应的   SQL   语句应是这样的:  
                SELECT   "DA_DH"."DHHM",  
                                "DA_HTH"."DWM"  
                FROM   "DA_HTH",  
                "DA_DH"  
                WHERE   ("DA_HTH"."DHHM"="DA_DH"."DHHM")  
同样的程序可用下拉数据窗口来完成,   这里不再具体介绍.但是,   应当注意,   以上两种方法究竟哪一种数据更快,   与表的结构,   表的数量,   连接的方法等均有关系,   应当具体分析.  
3.   共享数据  
在一个应用程序中,   某些数据需要频繁的使用,   如果在每次使用时都从数据库中进行检索,   则需占用大量的服务器资源和网络资源.   为了减少开销,   可以在客户端对这些数据只进行一次检索,   然后允许其它任务共享这些数据.    
        例如,   如果有两个数据窗口,   都需要从第三方表中检索出用户的电话号码,   且此列用下拉数据窗口给出.   如果每次都对电话号码进行检索,   则性能较低.   因此,   可以单独建立一个关于电话号码的数据窗口.   在每次打开窗口时,   首先将电话号码检索到此数据窗口中,   然后另外两个数据窗口中关于电话号码的下拉数据窗口可以共享此数据窗口中的数据.  
在窗口的   OPEN   事件中编写如下程序:  
                dw_1.settransobject(sqlca)  
                dw_2.settransobject(sqlca)    
                dw_3.settransobject(sqlca)    
                //   检索   dw_1    
                dw_1.retrieve()  
                //   使   DW_2   的下拉数据窗口共享   DW_1  
                datawindowchild   child1  
                dw_2.getchild( "dhhm ",child1)  
                child1.settransobject(sqlca)  
                dw_1.sharedata(child1)  
                //   使   DW_2   的下拉数据窗口共享   DW_1  
                datawindowchild   child2  
                dw_3.getchild( "dhhm ",child2)  
                child2.settransobject(sqlca)  
                dw_1.sharedata(child1)  
        使用这种方法,   避免了各个数据窗口间物理的拷贝数据,   因此减少了空间上的开销,提高了应用程序的综合性能.  
4.   数据窗口间数据的拷贝  
        如果需要在数据窗口间共享数据,   应当尽量使用   SHAREDATA()   函数,   但是,   SHAREDATA()   函数并不是物理地在数据窗口间拷贝数据,   如工在显示数据的同时,   还要对数据进行操作,   则需要进行数据的拷贝.  
例如,   要求将   DW_1   中选定的行拷贝到   DW_2   中:  
        在窗口的   OPEN   事件中编程:  
                dw_1.settransobject(sqlca)  
                dw_2.settransobject(sqlca)  
                dw_1.retrieve()  
        在数据窗口   DW_1   的   ROWFOCUSCHANGED   事件中编写下列程序:    
                long   lr    
                lr   =   dw_1.selectrow(0,false)  
                lr   =   dw_1.getrow()  
                lr   =   dw_1.selectrow(lr,true)  
要完成从   DW_1   到   DW_2   的拷贝工作,   有两种方法:  
第一种:    
在按钮   "拷贝"   的   CLICKED   事件中编程  
long   lr    
lr   =   dw_1.getselectedrow(0)  
dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)  
执行程序,   利用   POWERBUILDER   PROFILER   得出所需时间为   1.7034(百分之一秒)  
第二种:    
在按钮   "拷贝"   的   CLICKED   事件中编程  
dw_2.object.data   =   da_1.object.data.selected  
执行程序,   利用   POWERBUILDER   PROFILER   得出所需时间为   0.8062(百分之一秒)  
5.   数据窗口属性的访问和修改  
A.   数据窗口属性的访问  
        在程序中访问数据窗口的属性有下列几种方法:  
        A1.   采用点表达式访问  
        A2.   应用多个独立的   DESCRIBE()   函数访问  
        A3.   只使用一个   DESCRIBE()   函数,   采用复合参数访问多个属性  
上面三中方法,   通常第一种方法最慢,   第三种方法最快.    
例如:    
        在窗口的   OPEN   事件中  
        DW_1.SETTRANSOBJECT(SQLCA)  
        DW_1.RETRIEVE()  
第一种方法:    
在检索按钮的   CLICKED   事件中编程.  
        string   dx,   dy,   dh,   dw  
        dx   =   dw_1.object.da_dh.x  
        dy   =   dw_1.object.da_dh.y  
        dx   =   dw_1.object.da_dh.height  
        dy   =   dw_1.object.da_dh.width  
        st_1.text   =dx+","+dy+","+dh+","+dw  
第二种方法:  
        string   dx,   dy,   dh,   dw  
        dx=dw_1.describe("da_dh.x")  
        dx=dw_1.describe("da_dh.y")  
        dx=dw_1.describe("da_dh.height")  
        dx=dw_1.describe("da_dh.width")  
        st_1.text   =dx+","+dy+","+dh+","+dw  
第三种方法:  
        string   dx,   dy,   dh,   dw  
        st_1.text=dw_1.describe("da_dh.x"   +&  
                                                        "da_dh.y"   +&  
                                                        "da_dh.height"   +&  
                                                        "da_dh.width")  
实验证明,   第三种方法的速度是最快的.   但是程序的可读性最差.  
B.   数据窗口属性的修改  
在程序中修改数据窗口的属性有下列几种方法:  
        A1.   采用点表达式修改  
        A2.   应用多个独立的   MODIFY()   函数访问  
        A3.   只使用一个   MODIFY()   函数,   采用复合参数访问多个属性  
上面三中方法,   通常第一种方法最慢,   第三种方法最快.    
例如:    
        在窗口的   OPEN   事件中  
        DW_1.SETTRANSOBJECT(SQLCA)  
        DW_1.RETRIEVE()  
第一种方法:    
在检索按钮的   CLICKED   事件中编程.  
        DW_1.SETREDRAW(FALSE)  
        dw_1.object.da_dh.x   =   18  
        dw_1.object.da_dh.y   =   16  
        dw_1.object.da_dh.height   =   100  
        dw_1.object.da_dh.width   =   200  
        DW_1.setredraw(true)  
        st_1.text   =dx+","+dy+","+dh+","+dw  
第二种方法:  
        DW_1.SETREDRAW(FALSE)  
        dw_1.modify("da_dh.x   =   18")  
        dw_1.modify("da_dh.y   =   16")  
        dw_1.modify("da_dh.height   =   100")  
        dw_1.modify("da_dh.width   =   200")  
        dw_1.setredraw(true)  
第三种方法:  
        dw_1.modify("da_dh.x=18"   +&  
                                "da_dh.y=16"   +&  
                                "da_dh.height=100"   +&  
                                "da_dh.width=200")  
实验证明,   第三种方法的速度是最快的.   但是程序的可读性最差.注意,   在方法一和方法二中,   都使用的   setredraw()   函数以减少屏幕的重绘,   否则,   执行速度将严重下降.  
6.   数据窗口中数据的访问    
在程序中,   经常会需要动态的修改数据窗口中的数据.   对此,   PB   提供了多种方法,   各种方法在性能上会有一些差异.  
A.   数据窗口中数据的访问  
        目的:   将数据窗口中的电话号码存放在一个数组中.请比较下面两中方法.  
        方法一:  
        string   da_dh[]  
        long   ll,i    
        ll   =   dw_1.rowcount()  
        for   i   =   ll   to   1   stet   -1  
        da_dh   =   dw_1.getitemstring(i,"dhhm")  
        next  
        方法二:    
        string   da_dh[]  
        da_dh[]   =   dw_1.object.dhhm.current  
测试发现,   第二种方法比第一种方法快将近一倍.   数据量越大这种差异越明显.  
B.   数据窗口中数据的修改  
        目的:   修改数据窗口中的电话号码列的值.  
        请比较下面两中方法.  
        方法一:  
        dw_1.setitem(i,"dhhm",l_name)  
        方法二:    
        dw_1.object.name   =   l_name  
测试发现,   第二种方法比第一种方法快将近一倍.   数据量越大这种差异越明显.  
7.   数据窗口事件对性能的影响  
对于数据窗口控制中经常发生的事件,   应当尽量减少其中的程序代码.  
特别是如下事件:  
        A.   itemchanged  
        b.   editchanged  
        c.   itemfocuschanged  
        d.   pbm_dwnkey  
        e.   rowfocuschanged  
        f.   retrieverow  
在这些事件中的任何处理程序,   都会降低应用程序的处理速度.   所以应当尽量减少这些事件中的处理程序,   必要时,   可以考虑只将重要的代码放在这些事件中,   而将剩余的代码放在一个传递的事件中.  
例如,如果需要用到数据窗口的   ROWFOCUSCHANGED   事件,可以为数据窗口定义一用户事件   "UE_RE",而在数据窗口的   ROWFOCUSCHANGED   事件中写如下代码:  
      PARENT.postevent("ue_re")  
        在   UE_RE   事件中再编写相应的程序代码,如:  
        string   code    
        dw_1.selectrow(0,false)  
        dw_1.selectrow(rownum,true)  
        code   =   getitemstring(dw_1,rownum,"dhhm")  
        dw_2.retrieve(code)  
另外,   为了获得当前行号,应尽量使用数据窗口的   CURRENTROW   变量,而少用   GETROW()   函数。  
8、   数据窗口的列名称与列编号  
对数据窗口的某列进行访问,   可以采用该列的名称,   也可以使用该列的编号,  
例如:  
采用列编号:  
        dw_1.object.data[ll_row,2]  
dw_1.getitemstring(3,2)  
采用列名称表示某列:  
        dw_1.object.article_text[ll_row]  
        dw_1.getitemstring(3,"dhhm")  
        dw_1.setitem(3,"date",1999-03-31)  
        ...  
对于以上两种方法,   如果只进行一次查询,   在速度上并没有太大的区别,如过需要循环访问数据窗口上的某一列,   则速度上的差异就表现的比较明显,才用第一种方法要快,   但是程序的可读性比较差。但是,   在使用函数时(如   GETITEM()   和   setitem()   ),   执行速度往往没有很大差别。  
9、   计算域  
数据窗口的计算域会对数据的操作性能产生影响。   如果数据窗口中包含许多复杂的计算域,将严重影响数据窗口的执行速度。
共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
JohnPhan

主题

0

回帖

228

积分

注册会员

积分
228
贡献
在线时间
小时
2007-10-11 09:04:08 | 显示全部楼层

string da_dh[]  
da_dh[] = dw_1.object.dhhm.current

这个方法头一次见到. 新奇.

共享共进共赢Sharing And Win-win Results
28860823

主题

0

回帖

4

积分

新手上路

积分
4
贡献
在线时间
小时
2007-10-17 00:08:03 | 显示全部楼层
这是个好贴哦
共享共进共赢Sharing And Win-win Results
lovelyni

主题

0

回帖

76

积分

注册会员

积分
76
贡献
在线时间
小时
2007-12-19 22:09:42 | 显示全部楼层
[em01]看看
共享共进共赢Sharing And Win-win Results
langzpin

主题

0

回帖

1

积分

新手上路

积分
1
贡献
在线时间
小时
2007-12-22 23:28:59 | 显示全部楼层

共享共进共赢Sharing And Win-win Results
miscode

主题

0

回帖

3

积分

新手上路

积分
3
贡献
在线时间
小时
2008-2-28 12:22:15 | 显示全部楼层

好贴

共享共进共赢Sharing And Win-win Results
fxyang13

主题

0

回帖

6

积分

新手上路

积分
6
贡献
在线时间
小时
2008-3-27 21:38:30 | 显示全部楼层

高见!学习学习!!!

共享共进共赢Sharing And Win-win Results
nxspharm

主题

0

回帖

8

积分

新手上路

积分
8
贡献
在线时间
小时
2008-5-8 22:22:00 | 显示全部楼层
QUOTE:
以下是引用JohnPhan在2007-10-11 9:04:08的发言:

string da_dh[]  
da_dh[] = dw_1.object.dhhm.current

这个方法头一次见到. 新奇.

这是直接得到指定列的所有行,不用循环了

共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-11-22 09:25 , Processed in 0.042401 second(s), 9 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表