毁&灭

随手笔记

关于Db.Search效率方面的几点心得

今天做一个需要显示出今天、明天、后天的车辆申请情况的应用时,总结了一些使用db.search做查询时效率方面的一些情况。
最开始我是想做一个View包含今天、明天、后天的车辆申请单,视图选择公式为:SELECT form = "XXX" & (@Year(@TextToTime(Applydate))=@Year(@Today) & @Month(@TextToTime(Applydate)=@Month(@Today) & (@Day(@TextToTime(Applydate))=@Day(@Today) | @Day(@TextToTime(Applydate))=@Day(@Tomorrow) | @Day(@TextToTime(Applydate))=@Day(@Adjust(@Tomorrow; 0; 0; 1; 0; 0; 0)))))
这个公式写的实在是巨复杂,导致在很少文档量的情况下刷新这个视图都要30秒以上,用LS去getview时也是非常的慢。

于是我改写了这个视图选择公式为:SELECT form = "XXX" & (@TextToTime(Applydate)=@Today | @TextToTime(Applydate)=@Tomorrow | @TextToTime(Applydate)=@Adjust(@Tomorrow; 0; 0; 1; 0; 0; 0)),改写后的视图刷新稍微快了些,但是web端展现页面时还是会有明显停顿的感觉。

接着我换用db.search直接从数据库中查询,查询公式为: search$ = {Form="XXX" & (@TextToTime(Applydate)=@Today | @TextToTime(Applydate)=@Tomorrow | @TextToTime(Applydate)=@Adjust(@Tomorrow; 0; 0; 1; 0; 0; 0))}这样得到的数据其实跟视图展示的方法速度上是差不多的,还是会有明显的停顿。
 
最后把今天、明天、后天的值算出来转换成String,然后再用db.search来查询,这个时候页面显示速度就很快了,基本上一刷而过。
具体代码是:
Dim date1 As New NotesDateTime(Today())
today1$ = Format$(date1.DateOnly, "YYYY-MM-DD")
Call date1.AdjustDay(1)
tomorrow1$ = Format$(date1.DateOnly, "YYYY-MM-DD")
Call date1.AdjustDay(1)
thirdday$ = Format$(date1.DateOnly, "YYYY-MM-DD")
search$ = {Form="XXX" & (Applydate="}+today1$+{" | Applydate="}+tomorrow1$+{" | Applydate="}+thirdday$+{")}
 
由此总结出以下几点:
1. 在视图选择公式中尽可能选择简单的逻辑来组成条件选择公式。
2. 在视图选择公式中尽可能避免使用@Today,@Tomorrow这样的函数,这样的视图每次刷新时都会重建索引(这类视图好像有个名称的,不过忘了),很影响系统性能的。
3. 在针对要获取明天、后天这样的动态日期的数据时,用LS的Db.search比用视图效率要高,因为LS中可以把明天、后天这样的值先算出来再带入searchformula$中成为一个常量,而视图选择公式就没法这样来做了。 
阅读更多
个人分类: Lotus Notes
上一篇二叉树三种遍历的非递归算法
下一篇lotus模糊查询
想对作者说点什么? 我来说一句

基于层次客体的权限策略研究

2009年12月11日 194KB 下载

关于面的java心得

2013年12月01日 42KB 下载

没有更多推荐了,返回首页

关闭
关闭