SQL语句中WHEN部分,能用索引来优化的吗?

mywisdom88 2018-01-19 11:59:55
--select datediff(mi,30,getdate()),getdate(),dateadd(mi,-10,getdate())
/*
if object_id('..f_test') is not null drop table f_test

create table f_test(
iNo int,
cName varchar(20) default '',
iLock int default 0,
dLockTime datetime default null,
cLockUser varchar(20) default ''
)
insert into f_test(iNo,cName)
select 1,'11' union all
select 2,'22' union all
select 3,'33' union all
select 4,'44'

*/
--create index f_test_iNo on f_test(iNo)
--create index f_test_cName on f_test(cName)
--create index f_test_iLock on f_test(iLock)
--create index f_test_dLockTime on f_test(dLockTime)
--create index f_test_iNo_iLock on f_test(iNo,iLock)
--create index f_test_iNo_iLock_cName on f_test(iNo,iLock,cName)

declare @iNo int,@cName varchar(20)
select @iNo=1,@cName='11'
--update f_test set iLock=1 where iNo=2
--update f_test set iLock=1,dLockTime=getdate() where iNo=3

select iNo,cName,iLock,dLockTime,cLockUser,
case when iLock=0 or (iLock>0 and (cName =@cName or dateadd(mi,-5,getdate())<dLockTime or dLockTime is null))
then 0 else 1 end as rLock
from f_test
where iNo=@iNo
上面的语句,怎么做才会优化的,上面的索引,不知道那个才会优化,WHEN部分呢?
...全文
490 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-01-19
  • 打赏
  • 举报
回复
引用 3 楼 mywisdom88 的回复:
由于数据少,我也不知道时间, 我就是想知道,在 WHEN部分的,能不能利用索引,优化的.
那你这个案例就没什么意义。 CASE 部分情况应该还是可以用得到索引的。
吉普赛的歌 版主 2018-01-19
  • 打赏
  • 举报
回复
总数据量有多少?另外贴一下执行计划。
mywisdom88 2018-01-19
  • 打赏
  • 举报
回复
由于数据少,我也不知道时间, 我就是想知道,在 WHEN部分的,能不能利用索引,优化的.
mywisdom88 2018-01-19
  • 打赏
  • 举报
回复
OwenZeng_DBA 2018-01-19
  • 打赏
  • 举报
回复
执行多长时间,执行计划有吗
mywisdom88 2018-01-19
  • 打赏
  • 举报
回复
SQL的锁,我搞不懂,比如 ID,NAME..... 1,张三 2,李四 3,王五 当我在编辑 1的记录时,别人能看这条记录,但他是不能修改这条记录,(客户端在修改1记录) SQL的锁,能有这个功能?
吉普赛的歌 版主 2018-01-19
  • 打赏
  • 举报
回复
引用 6 楼 mywisdom88 的回复:
我是想,自己来锁记录, 当我想修改这条记录时,我把 iLock更新为1,同时,更换 dLockTime,cLockUser 别人能读,但他读出来的这条数据,他是不能修改的, rLock=1, 这样,我就不理他系统的锁了,当超过10分钟时,忽略 iLock=1这个条件了. 我想知道, case when 部分,会不会造成太多的开销的?
尽量不要自己 “发明” 锁, 这样效率不高, 弄得不好运行都有问题。 把SQL Server本身的锁用好就行了
OwenZeng_DBA 2018-01-19
  • 打赏
  • 举报
回复
引用 6 楼 mywisdom88 的回复:
我是想,自己来锁记录, 当我想修改这条记录时,我把 iLock更新为1,同时,更换 dLockTime,cLockUser 别人能读,但他读出来的这条数据,他是不能修改的, rLock=1, 这样,我就不理他系统的锁了,当超过10分钟时,忽略 iLock=1这个条件了. 我想知道, case when 部分,会不会造成太多的开销的?
从执行计划看到,你的主要开销是查找f_test表 ,case when 并没有造成多少开销。
mywisdom88 2018-01-19
  • 打赏
  • 举报
回复
我是想,自己来锁记录, 当我想修改这条记录时,我把 iLock更新为1,同时,更换 dLockTime,cLockUser 别人能读,但他读出来的这条数据,他是不能修改的, rLock=1, 这样,我就不理他系统的锁了,当超过10分钟时,忽略 iLock=1这个条件了. 我想知道, case when 部分,会不会造成太多的开销的?

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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