最近在做一个统计功能的时候发现一个很奇怪的问题,如下的两段代码:
update
pv6
set
pv0
=
(
select
count
(
0
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
convert
(
char
(
10
),
getdate
(),
121
))
where
title
=
1
select
count
(
0
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
convert
(
char
(
10
),
getdate
(),
121
))
上面一个update执行2分钟,下面的只需要执行10秒!
注明一下:
where title=1只会查出1行,也就是说update只会更新1行
clubreply是一个超级大的表,几千万行,rReplayDate无索引
pv6是一个超级小的表,3行2列,而且极少查这个表,不会出现锁的问题
不明白为什么于是做成了如下的方式
declare
@pv
int
;
set
@pv
=
(
select
count
(
*
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
convert
(
char
(
10
),
getdate
(),
121
));
update
pv6
set
pv0
=
@pv
where
title
=
1
发现还是执行了2分钟
于是又改了这种方法实现
declare
@count
int
select
@count
=
count
(
0
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
convert
(
char
(
10
),
getdate
(),
121
)
update
pv6
set
pv0
=
@count
where
title
=
1
终于执行了10秒
然而这一切很奇怪呢,这语句里面最大的效率问题好像是convert(char(10),getdate(),121),为了证明一下,把两个执行2分钟的语句优化一下得到
declare
@date
datetime
;
set
@date
=
convert
(
char
(
10
),
getdate
(),
121
);
update
pv6
set
pv0
=
(
select
count
(
0
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
@date
)
where
title
=
1
declare
@pv
int
;
declare
@date
datetime
;
set
@date
=
convert
(
char
(
10
),
getdate
(),
121
);
set
@pv
=
(
select
count
(
*
)
from
clubreply
with
(nolock)
where
rReplyDate
>=
@date
);
update
pv6
set
pv0
=
@pv
where
title
=
1
以上这两条语句执行的时间为10秒
果然是convert在捣鬼.
最后的结论如下:在select作为结果集赋值的时候,其中的条件会按照select的条数计算