海量数据检索导致的速度问题。。。

liujien 2004-01-14 06:06:21
按检索按钮,则数据窗口的复杂SQL需要检索的数据量大约在100万左右这个数量级上,结果老挨客户批判。

解决方式有几种:
1。扩大内存等硬件
2。将PB检索能否放置到后台,检索完毕后弹回前台,同时可以开其他窗口进行查询。不然现在等于是锁住一个窗口后客户长时间等待,什么也做不了。这是一个比较好的变通的方法。
3。能否在数据窗口中检索到一行或几行就显示几行,现在是检索完全部数据才显示,系统跟假死机一样。
4。优化SQL,这个就不用各位兄弟帮忙的,另外的问题。

就是2,3有没有什么好的方式?
或者有其他更好的思路?
...全文
179 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkzhou 2004-01-15
  • 打赏
  • 举报
回复
不同的sql语句写法 在性能上有天差之别

楼主 不知道你是用什么数据库
我是用sybase的
hkzhou 2004-01-15
  • 打赏
  • 举报
回复
1:查看索引是否正确使用,正确建立索引
2:采用强制查询计划试试
3:使用存储过程的方式
4:sql语句规范化
5:表连接方式是否有更好的途径
________
一般索引用对了的话100w条数据查询应该不慢

________
AndyPengcsu 2004-01-15
  • 打赏
  • 举报
回复
使用查询中间表的办法,将检索出来的数据先放到一个临时表里面,这样就可以先放一部分,现实一部分
freedom2001 2004-01-15
  • 打赏
  • 举报
回复
分散数据,把需要显示用的和统计用的分别记录到不同的表中去统计,另外增加备份和清空的功能,按年或季度备份、清空,否则你连续你年的数据都堆一起的话,用什么办法都不可能搞定
promark 2004-01-15
  • 打赏
  • 举报
回复
我觉得最好还是分析一下业务模式,最后显示给客户的数据肯定不会太多,如果是设计上的原因,造成数据分散,那就只能在设计上想办法,譬如调整查询的路径,创建查询用的临时表,利用tempdb等
如果实在没办法提高速度,那只能对客户说,100万的数据,你还想1秒显示出来?!
ahuanghp 2004-01-15
  • 打赏
  • 举报
回复
用的yeild函数,
一般来说只对循环起做用。对于retrieve来说做用应当不大吧。
除非你改为SETITEM
但那样时间又会长一些。
我看还是写在后台做个多线程的好。
就是太麻烦。/、
PB就这点烂呀
chengjian 2004-01-15
  • 打赏
  • 举报
回复
我也有同样的问题,只是不象你的数据量那么大,学习
圣殿骑士18 2004-01-15
  • 打赏
  • 举报
回复
一个建议:
首先定义GOODS为clustered index
然后写存储过程:
首先根据GOODS条件将结果集放在临时表
再从临时表做2次查询

这样只要提高第一次查询的效率即可。
liujien 2004-01-15
  • 打赏
  • 举报
回复
rows --> retrieve options --> rows as needed 没有作用,不知道是什么意思的说。
索引肯定是加入了的,这是最起码的东西哦。
程序设置检索行数大于1000时,提示用户是否继续检索。这个方法肯定行不通的,我要是有100万行,客户会被烦死的。
用的yeild函数,倒是有些作用。
sinkiangscorpio 2004-01-15
  • 打赏
  • 举报
回复
写存储过程,然后数据窗口中使用。
liujien 2004-01-15
  • 打赏
  • 举报
回复
用的datawindow的retrieve方法,这个rows --> retrieve options --> rows as needed就一点用都没有了。
qianfl 2004-01-15
  • 打赏
  • 举报
回复
数据窗口中菜单:rows --> retrieve options --> rows as needed
这个作用是开始只取出一屏的数据,随着滚动条往下拉取后面的,这是比较好的方法
liujien 2004-01-15
  • 打赏
  • 举报
回复
跟踪到的一个原始的SQL语句

SELECT YYYY,MM,I_VALUE,I_MONEY,CUS_ID,ENTERPRISE,ENT_TYPE,ENT_AREA,STAR_AREA,ORI_AREA,TRAD_TYPE,GOODS FROM IMTM01_IMPORT where (((IMTM01_IMPORT.yyyy > 2001) and (IMTM01_IMPORT.yyyy < 2001 )) or ((IMTM01_IMPORT.yyyy = 2001 ) and (IMTM01_IMPORT.yyyy < 2001 ) and (IMTM01_IMPORT.mm >= 1 )) or ((IMTM01_IMPORT.yyyy = 2001 ) and (IMTM01_IMPORT.yyyy > 2001 ) and (IMTM01_IMPORT.mm <= 2 )) or ((IMTM01_IMPORT.yyyy = 2001 ) and (IMTM01_IMPORT.yyyy = 2001 ) and (IMTM01_IMPORT.yyyy = 2001 ) and (IMTM01_IMPORT.mm <= 2 ) and (IMTM01_IMPORT.mm >= 1 )) ) and ( GOODS='85426000' or GOODS='85424000' or GOODS='85421910' or GOODS='85421920' or GOODS='85421930' or GOODS='85423000' or GOODS='85421400' or GOODS='85422110' or GOODS='85422120' or GOODS='85422190' or GOODS='85422900' )
liujien 2004-01-15
  • 打赏
  • 举报
回复
客户需要查询到的数据肯定是10万这个量级上的,但是总的数据量肯定是100万量级上的。
业务模式就是如此,能拆分的表已经都拆了,该建表索引的也建了。
liujien 2004-01-15
  • 打赏
  • 举报
回复
ORACLE 9I FOR AIX的数据库。
就一条复杂SQL语句。
存储过程肯定无法使用的。
SQL=Select xxx from xxx where ...........
where从句超长。有很多and连接。
xc008 2004-01-14
  • 打赏
  • 举报
回复
用函数idle()控制
thelazyman 2004-01-14
  • 打赏
  • 举报
回复
按方法2可以设置异步检索
方法3:程序设置检索行数大于1000时,提示用户是否继续检索。
sinkiangscorpio 2004-01-14
  • 打赏
  • 举报
回复
增加索引。
klbt 2004-01-14
  • 打赏
  • 举报
回复
数据窗口中菜单:rows --> retrieve options --> rows as needed

754

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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