| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 373 人关注过本帖
标题:需频繁遍历更新的字段,是否有必要创建索引?
取消只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:517
专家分:380
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:3 
需频繁遍历更新的字段,是否有必要创建索引?
问题:
表 mytable 有10000行记录,其中有一个整型值字段 Score,会在每一次循环中,遍历更新一次,并查询是否存在值大于95的记录:

select B
use myTable
select A
use myIndex

scan
   *select A
   lnPara = A.ParaIndex
   select B
   * 批量更新所有记录
   update mytable set score = setNewScore(lnPara)
   locate for score > 95
   if found()
      do something
   endif
endscan

Score 字段是否有必要建立索引,以便 locate for score > 95 能快速查询?
存在这个疑问是因为:
update mytable set score = setNewScore(lnPara)
会遍历更新10000次score,同时VFP要自动维护score的索引,这造成性能损失。
两相权衡之下,究竟是建立索引效率高,还是不要索引更快?

DeepSeek 回答:
在你的当前代码逻辑下,不建议为score字段建立索引,原因如下:
索引维护成本:每次UPDATE都会导致score索引的完全重建(10000次更新)
查找频率低:每次循环只执行1次LOCATE
总操作比例:更新操作:查找操作 = 10000:1

恰好,我也没创建Score索引。
话说,DeepSeek 的分析,正确吗?

搜索更多相关主题的帖子: 索引 字段 score 更新 遍历 
3 天前 13:18
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:517
专家分:380
注 册:2013-10-4
收藏
得分:0 
myIndex 表有2000行记录,负责提供参数,用于遍历 myTable 表以生成 score值,然后测试是否出现 > 95 的结果。
其中,setNewScore() 函数很耗时,完整 Scan...Endscan 一遍外层循环,需时5个小时以上。
故而,程序对于性能异常敏感,哪怕能节省1毫秒、10毫秒,也是极好的!
我们的目标是:能抠就抠,抠到极致!
前天 09:43
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:517
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用kangss在2025-11-2 11:40:52的发言:

不知道统计的啥,5个小时,太吓人了
大概率有很大提速空间

前几天发现记录多时, 2 个表 update,速度很慢,改用 set relation to 后 replace 速度秒完成


尝试以不同的参数,去调用某个非常耗时的除重过程……其实这原本是 Python 的活儿,只不过既然用到了几个本地表,感觉还是 VFP 方便,就直接用 VFP 干了。
确实,VFP本地表,有无恰当的索引,执行性能相差十万八千里!
前天 12:48
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:517
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用yiyanxiyin在2025-11-3 15:50:03的发言:

频繁更新又需要作为查询条件进行频繁查询的字段需要建立索引, 更新时考虑使用事务进行批量更新, 一批只会重建一次索引,从而降低多次重建索引带来的性能问题


确实,我疏忽了!感谢指教!
其实,顶楼的代码可能应为 score 字段创建索引的。
我老眼昏花,以为要重建索引10000次,事实上,只有1次!
update mytable set score = setNewScore(lnPara)
这一句代码,其实也就相当于批量事务,VFP在内部自动维护索引时,只需重建1次。
7 小时前
快速回复:需频繁遍历更新的字段,是否有必要创建索引?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018478 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved