【发布时间】:2011-04-13 07:16:52
【问题描述】:
我正在创建一个应用程序作为 URL 计数器。 我创建了一个表来存储 url 及其计数。
CREATE TABLE [dbo].[tblurlcounter](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[type] [varchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[count] [bigint] NULL,
CONSTRAINT [PK_tblurlcounter] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
我创建了一个存储过程来在表中插入/更新 url。 意味着当使用存储过程将值“URL”插入到该表中时,我会检查它是否存在然后更新它的计数,如果不存在则将其插入到 count=1 的表中。
我的存储过程是这样的:
declare @count int
select @count= [count] from tblurlcounter where [type] = @type
if @count > 0
begin
update tblurlcounter set [count]=@count + 1 where [type] = @type
select @count + 1
end
else
begin
INSERT INTO [dbcounter].[dbo].[tblurlcounter]
([type]
,[count])
VALUES
(@type
,1)
end
此应用程序将在一分钟内获得大约 80,000 到 100,000 次点击。所以我希望我的存储过程应该以良好的速度执行操作。我的意思是我的解决方案应该优化。
有人建议我更改我的表并创建其名为“type”(我用来存储 url)的文件作为主键,在存储过程中我应该首先尝试插入记录,如果它抛出错误然后在下一行检查错误并执行更新操作。
所以我很困惑哪个会更快,主键错误方法或者我应该使用选择查询并基于选择的结果我应该执行插入/更新操作
现在我需要专家的建议,哪种方法是正确的,如果有其他好的方法可用,请给我建议。
谢谢
【问题讨论】:
-
你的代码当前有一个竞争条件(不使用事务并且使用比默认更强的隔离):两次执行都可以观察到计数为 0,因此尝试插入。
标签: sql sql-server-2005 stored-procedures query-optimization