导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

用数值与操作和空值对比查询数据,哪一个SQL语句执行效率更高?

wind 2007-11-30 11:08:48
有以下数据表

TEMPA
----------------------
ID iCheckMark cVerify cGodownMan
1 0
2 3 C A
3 1 B
4 0

现有两种查询语句
select * from TEMPA where iCheckMark&1>0

select * from TEMPA where cVerify <>''
哪一个效率更高?
当需要更多的空值比较时呢?例:
select * from TEMPA where iCheckMark&3>0
select * from TEMPA where cVerify <>'' and cGodownMan<>''


...全文
234 点赞 收藏 22
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomyuansir 2007-12-05
学习中!顺便帮顶!!
回复
-狙击手- 2007-12-04
对列进行运算会让查询放弃索引进行全表扫描,所以下面的快呀
回复
hui_hui_2007 2007-12-04
帮顶
回复
yangtzeu 2007-12-04
如果将 where xxx<>'' 这样替换成 where 1=1 效率会更好吧
回复
wind 2007-11-30
我想大家在做权限设置时,是不可能一直无限增加字段代表不同的权限内容吧?
那么是不是说权限设置时,增加多个字段来做比较时的效率更高?
但只因为缺少灵活性才采用数值的"与"运算?
回复
rouqu 2007-11-30
建议除了楼主想要找的人 其他人都可以闪
回复
wind 2007-11-30
iCheckMark的值来源与后边的字段定义
比如当
cVerify值不为''时,用2的0次方代表 为1
cGodownMan 值不为''时,用2的1次方代表 为 2
以此类推,有第三个字段时,用2的2次方代表,

这样当只有cVerify列不为''时,iCheckMark的值为1
当只有cGodownMan 列不为''时,iCheckMark的值为2
当cVerify,cGodownMan 都不为''时,iCheckMark的值为1+2=3
当cVerify,cGodownMan 都为''时,iCheckMark的值为0

这个和某些权限设置有些类似
回复
fcuandy 2007-11-30
好像我弄错了,不知道楼主数值是怎么定义的.
回复
wind 2007-11-30
这种情况下会怎么样呢?会不会达到一定的字段个数后第一种方法的效率会超过第二种方法呢?

为什么不能修改自己的回复?
回复
wind 2007-11-30
邹先生是认为第二个语句的效率比较高,但如果这种空值比较的字段有五六个或者更多呢?
select * from TEMPA where iCheckMark & 数值 > 0
select * from TEMPA where A字段<>'' and B字段<>'' and C字段<>'' and D字段<>'' and E字段<>'' .....
这种情况呢?是不会达到一定的字段个数后第一种方法的效率会超过第二种方法呢?
回复
rouqu 2007-11-30
如果这种空值比较的字段有五六个呢?
----------------------------
那除了比较 还能有什么办法...
回复
rouqu 2007-11-30
大意就是如此了 对列做运算很少能用上索引
回复
wind 2007-11-30
如果这种空值比较的字段有五六个呢?
回复
fcuandy 2007-11-30
首先,你的问题不是空值比较,是空字串比较,空值是null.
------------------------------------------------

select * from TEMPA where iCheckMark&1> 0

select * from TEMPA where cVerify <> ''
------------------------------------------------
个人觉得第一种高,这种逻辑运算,相信SQL处理的比你我更好。
逻辑运算有个定理,任何数与1进行与结果仍是它本身,我想SQL查询优化不会不考滤这一点。
那么实现执行的是
select * from TEMPA where iCheckMark >0
如果isCheckMark是tinyint类型,那就更无疑问是第一种效率高.



select * from TEMPA where iCheckMark&3> 0
select * from TEMPA where cVerify <> '' and cGodownMan <> ''
-------------------------------------------------
对于下面这个,第一句应该无法利用到索引,是按位与的,虽然说3转换为11,那么7是111,1111是15,SQL查询优化会不会考滤这些,暂时不清楚。第二种应该会快一些,如果都建索引的话。
回复
dawugui 2007-11-30
如果判断''只能用 = '' 或 <> '' 或 len(col) = 0
如果是判断null
可以用 is null 或 is not null
这两方法没可比性.
个人认为这两方法都要全表搜索,消耗时间都不少.

相对来说,后一种方法略微好点.
回复
如果对列进行计算(包括将列放在函数中), 则需要对每条记录的列值做计算, 这样才能知道结果.

而不做计算的话, 如果有合适的索引, 则直接扫描索引就可以找到合适的记录
回复
一般来说, 对列做计算的比不做计算的效率高
即: col1 & xx > 0 这类的效率低一些

回复
w2jc 2007-11-30
'' 和 空值(null)是完全不同的,
像''和0都属于正常的值,速度应该差不多的,但是NULL值不同
比较NULL值要慢一些
回复
wind 2007-11-30
但总应该是有差别的吧?
回复
wind 2007-11-30
我想知道的是,我写出来的两个语句因为执行结果是一样的,想知道从基理上来讲哪一个效率更好.
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告