使用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
上有索引将帮忙,尤其是当桌子越来越大的时候。如果你当前的版本很慢,那么我怀疑网络开销比查询的实际执行更应该受到指责。
而不是首先得到today
的ID
,然后决定是否需要在asp中INSERT
或UPDATE
,你可以在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
%>