主题:[讨论]逻辑表达式的先后顺序
VB代码:
[quote]Do While MsgBox("abc", vbYesNo, "YES") = vbYes And MsgBox("DDD", vbYesNo, "YES") = vbYes
MsgBox ("KKK")
Loop[/quote]
从这个程序可以看出来,
VB并没有优化的去判断条件,
虽然是 and 条件,
但仍将所有条件值从左到右都计算出结果后再进行 and 运算
未免有点浪费,而且失去了一些容错的判断优势.
在VFP里则不同,
会从左到右判断,而且会参照逻辑运算的符号,
如果是 or ,第一个条件成立了就不会去计算第二个条件了.
同样道理, and 的第一个条件不成立也就不会再去管第二个条件了.
这时候,一些复合条件以及容错表达式就得到了很好的处理.
比如:
do while vartype(T1)=2 and T1+T2 > 36 诸如此类
VB例子:(出错)
[quote]T1 = 9
T2 = 31
Do While VarType(T1) = 2 And T1 + T2 > 36
MsgBox ("KKK")
T1 = "ABC"
Loop[/quote]
VFP例子:(容错)
[quote]T1=9
T2=31
DO WHILE VARTYPE(T1)="N" AND T1+T2>36
MESSAGEBOX("KKK")
T1="ABC"
ENDDO[/quote]
知道了VFP的这个对逻辑表达式的判断特点后,
我去对SQL的条件进行了肤浅的尝试,
也许是因为我的数据太过简单了,
所以也希望大家能多些参与测试一下以验证经验.
我在26万的数据表当中(刻意放大的重复数据)
特意的使用了一些查询困难的条件, 结果 时间
select ..... where at("电话",资料)>0 110000 2秒
select ..... where day(日期)=1 7000 1秒
select ..... where at("电话",资料)>0 and day(日期)=1 6000 2秒
select ..... where day(日期)=1 and at("电话",资料)>0 6000 1秒
这些条件跟索引没有关系,
也跟Rushmore 技术的SET Optimize设置无关,
起决定作用的是,相关条件的先后顺序.
在 and 逻辑里,第一个条件不成立,就跳过,不用检测第二个条件
在 or 逻辑里,第一个条件成立,就跳过第二个条件,
那么,现在大家知道我在说什么了吧?
大家用自己手上的海量表测试一下,看是不是这个道理.
[quote]Do While MsgBox("abc", vbYesNo, "YES") = vbYes And MsgBox("DDD", vbYesNo, "YES") = vbYes
MsgBox ("KKK")
Loop[/quote]
从这个程序可以看出来,
VB并没有优化的去判断条件,
虽然是 and 条件,
但仍将所有条件值从左到右都计算出结果后再进行 and 运算
未免有点浪费,而且失去了一些容错的判断优势.
在VFP里则不同,
会从左到右判断,而且会参照逻辑运算的符号,
如果是 or ,第一个条件成立了就不会去计算第二个条件了.
同样道理, and 的第一个条件不成立也就不会再去管第二个条件了.
这时候,一些复合条件以及容错表达式就得到了很好的处理.
比如:
do while vartype(T1)=2 and T1+T2 > 36 诸如此类
VB例子:(出错)
[quote]T1 = 9
T2 = 31
Do While VarType(T1) = 2 And T1 + T2 > 36
MsgBox ("KKK")
T1 = "ABC"
Loop[/quote]
VFP例子:(容错)
[quote]T1=9
T2=31
DO WHILE VARTYPE(T1)="N" AND T1+T2>36
MESSAGEBOX("KKK")
T1="ABC"
ENDDO[/quote]
知道了VFP的这个对逻辑表达式的判断特点后,
我去对SQL的条件进行了肤浅的尝试,
也许是因为我的数据太过简单了,
所以也希望大家能多些参与测试一下以验证经验.
我在26万的数据表当中(刻意放大的重复数据)
特意的使用了一些查询困难的条件, 结果 时间
select ..... where at("电话",资料)>0 110000 2秒
select ..... where day(日期)=1 7000 1秒
select ..... where at("电话",资料)>0 and day(日期)=1 6000 2秒
select ..... where day(日期)=1 and at("电话",资料)>0 6000 1秒
这些条件跟索引没有关系,
也跟Rushmore 技术的SET Optimize设置无关,
起决定作用的是,相关条件的先后顺序.
在 and 逻辑里,第一个条件不成立,就跳过,不用检测第二个条件
在 or 逻辑里,第一个条件成立,就跳过第二个条件,
那么,现在大家知道我在说什么了吧?
大家用自己手上的海量表测试一下,看是不是这个道理.