| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2833 人关注过本帖
标题:如何一次性判断表中某些字段的值(字符型)是空的
只看楼主 加入收藏
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
不如你用实际数据测试下!!!
你用scan循环了记录,又用for遍历了字段。
没错,记录数越多的时候差距会越大,哪个用时会更长呢?
2011-06-26 09:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
按照要求,對數據表中每一個數據都要檢測一次,這是一定的開銷,我那段代碼是沒有冗餘操作的,但你的代碼有。SQL指令本身雖然有優化性能,但並非你建議在大量循環中使用的——因為它本身已有不可知的循環操作。SQL指令的威力,僅限於一條命令完成操作。

授人以渔,不授人以鱼。
2011-06-26 09:38
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
或者你认为replace会比update省时,不过如果你停留在foxbase的话,当然用replace了,不过能用SQL语句的时候我就不会用foxbase语句
2011-06-26 09:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這種測試我進行得多了。

授人以渔,不授人以鱼。
2011-06-26 09:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
再說一遍:SQL指令的威力僅在一次性使用中體現!如果你有一次性完成要求的SQL的指令,那絕對是SQL的快,然而現在你在不算少的循環中,它的額外開銷是非常打的。

授人以渔,不授人以鱼。
2011-06-26 09:45
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
用事实说话嘛,你测试下酒知道了。不要说你测了多少次。事实是我测试了,结果与你的想象很不一样啊
2011-06-26 09:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
隨你喜歡使用什麽代碼唄,我沒必要跟你爭這些東西。

授人以渔,不授人以鱼。
2011-06-26 09:48
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
或者按照你的想法,最好执行命令的时候,都不要用for或者where子句,因为这将对所有记录进行判断,应该要用scan遍历记录,然后逐记录操作,以避开对整个表的操作?

你的语句的冗餘是显而易见的,你可以将update改成replace....for,但是绝不应该scan整个记录。
要下了,你慢慢测试吧
2011-06-26 09:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
何來的replace for呢?每次replace只對當前記錄的一個字段單元操作,就相當於對樓主表格中每個單元格操作一次(還僅在需要的時候才執行IO操作),是最低限度的遍歴。這種操作絕大多數僅在內存中進行,不涉及磁盤IO(除非你的機器內存極少)。在共享數據庫環境中,差異是有的,在獨佔時,你那個才顯得快(差異較前者不明顯而已)。

我不知道你自稱做過的測試是怎麽回事,但從你以為我那代碼需要for或where語句來看,顯然沒有實際測試過。如果需要用for或where指令,就不需要兩重循環,那本質上跟你的SQL指令是一樣的,replace for會自動開啓SQL操作。

對二維表格(或數組)遍歴,兩重循環是必不可少的,用任何語句都一樣,本質上都是遍歴一次全部數據項。

[ 本帖最后由 TonyDeng 于 2011-6-26 10:03 编辑 ]

授人以渔,不授人以鱼。
2011-06-26 10:01
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
CREATE CURSOR test (f1 c(2),f2 c(8),f3 C(6),f4 c(7),f5 c(2),f6 c(3))
*随机产生2W条记录用于测试
FOR i=1 TO 20000
    INSERT INTO test VALUES (transform(INT(RAND(-1)*10)),transform(INT(RAND(-1)*10)),transform(INT(RAND(-1)*10)),;
    transform(INT(RAND(-1)*10)),"","")
ENDFOR

CLEAR

?"测试结果"
s1=SECONDS()
AFIELDS(af)
FOR i=1 TO ALEN(af,1)
    UPDATE test SET &af(i,1)="0" WHERE EMPTY(&af(i,1))
ENDFOR
?"   UPDATE语句耗时:",SECONDS()-s1

UPDATE test SET f5="",f6=""
s1=SECONDS()
    FOR nIndex = 1 TO FCOUNT()
        cField = FIELD(nIndex)
          REPLACE ALL (cField) WITH "0" FOR EMPTY(EVALUATE(cField))
    NEXT
?"  replace语句耗时:",SECONDS()-s1

UPDATE test SET f5="",f6=""
s1=SECONDS()
SCAN ALL
    FOR nIndex = 1 TO FCOUNT()
        cField = FIELD(nIndex)
        IF EMPTY(EVALUATE(cField))
            REPLACE (cField) WITH "0"
        ENDIF
    NEXT
ENDSCAN
?"SCAN内replace耗时:",SECONDS()-s1

[ 本帖最后由 xmlz 于 2011-6-26 14:49 编辑 ]
2011-06-26 12:55
快速回复:如何一次性判断表中某些字段的值(字符型)是空的
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023554 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved