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

如何优化访问计数器SQL查询?,sql,sql-server,asp-classic,sql-update,query-optimization,Sql,Sql Server,Asp Classic,Sql Update,Query Optimization,使用SQL server 2016,我创建了一个表VISIT,其中包含3列ID,settoday,counter。这是我用来计算每日访问量的asp代码。到目前为止,该表中有2000多条记录: <% 'today is calculated on local calendar then: sql="select * from visit where settoday='"& today &"'" recordSet.open sql,

使用SQL server 2016,我创建了一个表VISIT,其中包含3列IDsettodaycounter。这是我用来计算每日访问量的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
%>

我认为你可以通过避免两次访问数据库而获益匪浅。
此外,您应该始终尝试使用占位符和参数,而不是串联值等。我认为这并不是一个大问题,因为我假设
今天
不是用户提供的值,但仍然是

2000条记录一点也不多,但是是的,今天设置
上的索引将有帮助,尤其是随着表的增长。如果您当前的版本很慢,那么我怀疑网络开销要比查询的实际执行更重要

与其先获取当前
ID
,然后决定是否需要在asp中插入
INSERT
UPDATE
,还不如在SQL中执行一次操作。 我已经很久没有写过这种代码了,我不得不把它写在记事本上,所以你可能需要在这里和那里修复一些东西,但我认为这是一个开始:

<%
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

%>

警告,您的代码容易受到注入攻击。参数化您的查询。表上是否有索引或主键?是的,我提到过,ID是主键,settoday是索引的@CharlieFace请通过为什么需要在
settoday
列上的索引来共享这些查询的查询计划?这会减慢表上的任何更新