用户表的一个主键外联表(记录用户的扩展信息),但这些信息经常被更新,以下哪种效率更高?

bizbuy 2009-02-26 08:18:44

方法一)
if exists(select uid from [users] where uid=100)
update [userpoint] set point = point +3
else
BEGIN
insert into [userpoint] () values
update [userpoint] set point = point +3
END

方法二)
update [userpoint] set point = point +3
IF @@rowcount =0
BEGIN
insert into [userpoint] () values
update [userpoint] set point = point +3
END


给[userpoint]加一条对应的外联记录,每个用户只有一次,而update是很频繁的动作。
是不是第二种方法更好呢?用第二种方法有什么问题吗?
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2009-02-27
  • 打赏
  • 举报
回复
你把方法一改为这样:

if not exists(select uid from [users] where uid=100)
insert into [userpoint] () values

update [userpoint] set point = point +3

如果不存在,则插入,然后只要update就行了(这个时候肯定存在了).
dawugui 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bizbuy 的回复:]
为什么?

当频繁给用户加分时,事实上不必再去检查用户是否存在。只需要更新记录就可以了。

如果每次加分操作都检查存在,而且加分的操作很频繁,这不是额外的开销吗?


第二种方法的弊端在哪里呢?
[/Quote]
你把方法一改为这样:

if not exists(select uid from [users] where uid=100)
insert into [userpoint] () values

update [userpoint] set point = point +3

如果不存在,着插入,然后只要update就行了(这个时候肯定存在了).
bizbuy 2009-02-27
  • 打赏
  • 举报
回复
为什么?

当频繁给用户加分时,事实上不必再去检查用户是否存在。只需要更新记录就可以了。

如果每次加分操作都检查存在,而且加分的操作很频繁,这不是额外的开销吗?



第二种方法的弊端在哪里呢?
ChinaJiaBing 2009-02-27
  • 打赏
  • 举报
回复

set statistics time on
...
set statistics time off
ChinaJiaBing 2009-02-27
  • 打赏
  • 举报
回复

测试一下每一个运行时间
set staticist time on
.. 语句
set staticist time on
oraclelogan 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dawugui 的回复:]
引用 7 楼 bizbuy 的回复:
引用 6 楼 dawugui 的回复:
你把方法一改为这样:

if not exists(select uid from [users] where uid=100)
insert into [userpoint] () values

update [userpoint] set point = point +3

如果不存在,则插入,然后只要update就行了(这个时候肯定存在了).


实际就没什么区别的,关键为什么第二种不好了?我觉得第二种的效率可能会更好

那你觉得六楼的方法是不是更好一些?
[/Quote]

大乌龟说的不错!
bizbuy 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dawugui 的回复:]

那你觉得六楼的方法是不是更好一些?
[/Quote]
我觉得六楼的方法和你开始说的第一种方法基本上是一回事
dawugui 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bizbuy 的回复:]
引用 6 楼 dawugui 的回复:
你把方法一改为这样:

if not exists(select uid from [users] where uid=100)
insert into [userpoint] () values

update [userpoint] set point = point +3

如果不存在,则插入,然后只要update就行了(这个时候肯定存在了).


实际就没什么区别的,关键为什么第二种不好了?我觉得第二种的效率可能会更好
[/Quote]
那你觉得六楼的方法是不是更好一些?
bizbuy 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawugui 的回复:]
你把方法一改为这样:

if not exists(select uid from [users] where uid=100)
insert into [userpoint] () values

update [userpoint] set point = point +3

如果不存在,则插入,然后只要update就行了(这个时候肯定存在了).
[/Quote]

实际就没什么区别的,关键为什么第二种不好了?我觉得第二种的效率可能会更好
dawugui 2009-02-26
  • 打赏
  • 举报
回复
如果每次仅仅是对uid进行单个查询,第一个好.

方法一)
if exists(select uid from [users] where uid=100)
update [userpoint] set point = point +3
else
BEGIN
insert into [userpoint] () values
update [userpoint] set point = point +3
END
dawugui 2009-02-26
  • 打赏
  • 举报
回复
如果每次仅仅是对uid进行单个查询,第一个好.

方法一)
if exists(select uid from [users] where uid=100)
update [userpoint] set point = point +3
else
BEGIN
insert into [userpoint] () values
update [userpoint] set point = point +3
END
htl258_Tony 2009-02-26
  • 打赏
  • 举报
回复
帮顶

34,590

社区成员

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

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