如何优化访问计数器SQL查询?



使用SQL server 2016,我已经创建了表VISITID,settoday柜台,. 这就是asp我用来计算每日访问量的代码。到目前为止,这个表中有2000多条记录:

<%
'today is calculated on local calendar then:
sql="select * from visit where settoday='"& today &"'"
recordSet.open sql,objcon
if not recordSet.eof then
sql="update visit set counter=counter+1 where id=" & recordSet("id")
objcon.execute sql
else

sql="insert into visit (settoday,counter) values ('" & today & "','1')"
objcon.execute sql
end if
recordSet.close
%>

ID列是主键,我还在上创建了一个索引settoday列。但是当我检查事件分析器时,更新查询需要很长时间才能执行。我还可以做些什么来优化更新代码?

我认为通过避免两次访问数据库可以获得很多好处。此外,您应该始终尝试使用占位符和参数,而不是连接值等。我认为这不是一个大问题,因为我认为today不是用户提供的值,但仍然。

2000条记录并不多,但是是的,在settoday上有索引帮忙,尤其是当桌子越来越大的时候。如果你当前的版本很慢,那么我怀疑网络开销比查询的实际执行更应该受到指责。

而不是首先得到todayID,然后决定是否需要在asp中INSERTUPDATE,你可以在SQL中的1个操作中做到这一点。我已经很久没有写过这种代码了,我必须在记事本上写出来,所以你可能需要在这里或那里修改一些东西,但我认为这是一个开始:

<%
sql = "DECLARE @today datetime = ?
UPDATE counter
SET counter = counter + 1
WHERE settoday = @today

IF @@ROWCOUNT = 0
BEGIN
INSERT INTO visit (settoday, counter) values (@today, 1)"
END"

set command = server.createobject("ADODB.Command")
set command.ActiveConnection = ...
command.QueryText = sql
command.CommandType = adCmdText
command.Parameters.Append(command.CreateParameter("@p1", adDate, adParamInput, today))
command.Execute
%>

相关内容

  • 没有找到相关文章

最新更新