sql语句问题,请问如何提高运行效率和速度?
请问下面SQL语句如何改写效率最高?请加以说明,谢谢。strsql="select*from"&tabl&"whereid='"&id&"'andidd='"&idd&"...
请问下面SQL语句如何改写效率最高?请加以说明,谢谢。
strsql="select * from "&tabl&" where id='"&id&"' and idd='"&idd&"'"
rs.open strsql,conn,3,3
if not rs.eof then
rs("degree")=rs("degree")+1
rs.update
else
rs.addnew
rs("degree")=1
rs("idd")=idd
rs("id")=id
rs.update
end if
可以用INSERT\update等,只要效率高就行.
这是一个函数内部的语句,需要执行它本身十几次,另外整个程序有七百多行与此近似的语句,有近百项的数据需要以最快速度存入数据库中然后释放服务器资源,所以如果方法好了一点,运行时间可能就快了几秒,那对于解决我的问题都是非常有帮助的.
数据库为ACCESS,请写出具体程序,sql server的也行.如果存储过程是最高效率的,请写出源代码,谢谢. 展开
strsql="select * from "&tabl&" where id='"&id&"' and idd='"&idd&"'"
rs.open strsql,conn,3,3
if not rs.eof then
rs("degree")=rs("degree")+1
rs.update
else
rs.addnew
rs("degree")=1
rs("idd")=idd
rs("id")=id
rs.update
end if
可以用INSERT\update等,只要效率高就行.
这是一个函数内部的语句,需要执行它本身十几次,另外整个程序有七百多行与此近似的语句,有近百项的数据需要以最快速度存入数据库中然后释放服务器资源,所以如果方法好了一点,运行时间可能就快了几秒,那对于解决我的问题都是非常有帮助的.
数据库为ACCESS,请写出具体程序,sql server的也行.如果存储过程是最高效率的,请写出源代码,谢谢. 展开
7个回答
展开全部
其实你的效率低的原因不是用SQL语句还是存储过程的问题。看你的描述以及代码,如果是多次循环上述代码的话,确实效率会比较低,原因是有一次循环就会和数据库产生一次查询和更新通讯,希望增加效率应该从尽量减少和数据库通讯方面来考虑解决,因为是这里出现了效率瓶颈。
下面是具体的代码分析:
首先更新和插入操作是无法减少的,必须一条纪录一条纪录更新,一条纪录一条纪录的插入,但是查询完全可减低为一次查询。
下面是伪代码:
strsql="select * from "&tabl&" where id+idd in ('所有要循环的id+idd,他们之间用逗号分开')"
rs.open strsql,conn,3,3
do while not rs.eof
rs("degree")=rs("degree")+1
tempstr=tempstr&id&idd&"|" '这里是将数据库中存在的id,idd记录保存下来,存入一个临时变量中,用|符号分割开。
rs.update
rs.movenext
loop
'上面的代码是更新了数据库中存在的纪录,并记录下了存在的记录ID+IDD
下面将所有存在的已update的id+idd的值从所有的id+idd的值中剔除掉,取到所有需要insert的id+idd纪录,然后一起insert进数据库即可。代码我不再写了,这样的字符串对比操作并不难,因为这样都是内存操作,速度会很快。仅提供一个思路。希望对你有用。
下面是具体的代码分析:
首先更新和插入操作是无法减少的,必须一条纪录一条纪录更新,一条纪录一条纪录的插入,但是查询完全可减低为一次查询。
下面是伪代码:
strsql="select * from "&tabl&" where id+idd in ('所有要循环的id+idd,他们之间用逗号分开')"
rs.open strsql,conn,3,3
do while not rs.eof
rs("degree")=rs("degree")+1
tempstr=tempstr&id&idd&"|" '这里是将数据库中存在的id,idd记录保存下来,存入一个临时变量中,用|符号分割开。
rs.update
rs.movenext
loop
'上面的代码是更新了数据库中存在的纪录,并记录下了存在的记录ID+IDD
下面将所有存在的已update的id+idd的值从所有的id+idd的值中剔除掉,取到所有需要insert的id+idd纪录,然后一起insert进数据库即可。代码我不再写了,这样的字符串对比操作并不难,因为这样都是内存操作,速度会很快。仅提供一个思路。希望对你有用。
展开全部
如果不用command方式的话,就只有优化这段代码了
strsql="select * from "&tabl&" where id='"&id&"' and idd='"&idd&"'"
rs.open strsql,conn,3,3 '这里改成1,1方式打开
if not rs.eof then
rs("degree")=rs("degree")+1 '不知道你的RS已经EOF了为什么还要对他操作,完全可以跳过,如果需要,这里直接使用CONN.execute(update语句)
rs.update
else
rs.addnew '这里换成conn.execute(insert)语句
rs("degree")=1
rs("idd")=idd
rs("id")=id
rs.update
end if
你可以在循环前加上StarTime=Timer()
循环后面加
EndTime=Timer()
response.WriteFormatNumber(EndTime-StarTime)*1000,0)
看看具体时间能提高多少
strsql="select * from "&tabl&" where id='"&id&"' and idd='"&idd&"'"
rs.open strsql,conn,3,3 '这里改成1,1方式打开
if not rs.eof then
rs("degree")=rs("degree")+1 '不知道你的RS已经EOF了为什么还要对他操作,完全可以跳过,如果需要,这里直接使用CONN.execute(update语句)
rs.update
else
rs.addnew '这里换成conn.execute(insert)语句
rs("degree")=1
rs("idd")=idd
rs("id")=id
rs.update
end if
你可以在循环前加上StarTime=Timer()
循环后面加
EndTime=Timer()
response.WriteFormatNumber(EndTime-StarTime)*1000,0)
看看具体时间能提高多少
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有用循环,那是确定只有一条记录了,这样的话,用不用SQL都差不多,效率上差距不大,如果是多条的话,最好还是用SQL做比较好。
如果再多的话,可以用存储过程来做
CREATE PROCEDURE UpdateTable(@TableName VARCHAR(50),
@ID VARCHAR(15), @IDD VARCHAR(15)) AS
DECLARE @TempID VARCHAR(15), @SQLCommand VARCHAR(2000)
BEGIN
SET @SQLCommand = 'SELECT @TempID = [ID] FROM ' + @TableName + 'WHERE [ID] = ''' + @ID + ''' AND IDD = ''' + @IDD + ''''
EXEC sp_executesql @SQLCommand, N'@TempID CHAR(15) out', @TempID out
IF @TempID IS NULL
SET @SQLCommand = 'INSERT INTO ' + @TableName + '(degree, idd, [id]) VALUES (1,''' + @IDD+ ''', ''' + @ID + ''')'
ELSE
SET @SQLCommand = 'UPDATE ' + @TableName + ' SET degree = degree + 1'
EXEC sp_executesql @SQLCommand
END
GO
不知道这样的存储过程对不对头
如果再多的话,可以用存储过程来做
CREATE PROCEDURE UpdateTable(@TableName VARCHAR(50),
@ID VARCHAR(15), @IDD VARCHAR(15)) AS
DECLARE @TempID VARCHAR(15), @SQLCommand VARCHAR(2000)
BEGIN
SET @SQLCommand = 'SELECT @TempID = [ID] FROM ' + @TableName + 'WHERE [ID] = ''' + @ID + ''' AND IDD = ''' + @IDD + ''''
EXEC sp_executesql @SQLCommand, N'@TempID CHAR(15) out', @TempID out
IF @TempID IS NULL
SET @SQLCommand = 'INSERT INTO ' + @TableName + '(degree, idd, [id]) VALUES (1,''' + @IDD+ ''', ''' + @ID + ''')'
ELSE
SET @SQLCommand = 'UPDATE ' + @TableName + ' SET degree = degree + 1'
EXEC sp_executesql @SQLCommand
END
GO
不知道这样的存储过程对不对头
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用Command对象具体怎么用你可以到网上查查(不建议找人写
代码因为与其把时间放在看别人代码上不如放在看原理和自己实践
上)
代码因为与其把时间放在看别人代码上不如放在看原理和自己实践
上)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最好用循环,会好点.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询