原有一个项目,使用ASP开发,使用Oracle数据库 。 使用下面的代码来获取查询语句。
Set RS = Server.CreateObject("ADODB.Recordset")
RS.open 所要执行的SQL语句, 数据库连接
RS.open 所要执行的SQL语句, 数据库连接
逻辑中存在一个两级的结构,在对父级数据进行循环的时候查询到每一条父级数据所包含的子级数据集合。
strSQL = "查询父级数据的SQL语句"
RS.open 所要执行的SQL语句, 数据库连接
Do Until RS.EOF
strSQL2 = "查询子级数据的SQL语句"
RS2.open 所要执行的SQL语句, 数据库连接
RS2.CLose
RS.MoveNext
Loop
RS.Close
RS.open 所要执行的SQL语句, 数据库连接
Do Until RS.EOF
strSQL2 = "查询子级数据的SQL语句"
RS2.open 所要执行的SQL语句, 数据库连接
RS2.CLose
RS.MoveNext
Loop
RS.Close
但是从Oracle数据库转到SQL Server数据库以后,逻辑没有变化但是时间却有了很大的变化。从原来的几秒变成了五十多秒,感觉是两个RecordSet的嵌套循环导致。解决方法是使用一个数组来存储父级数据,然后执行RS.Close,再循环数组来查询子级数据。
自己并不是很清楚其中的原因,请大家多多指点。谢谢。
--> 1. 重新定义数据库连接也是可以在混乱的代码中提高性能(如果实在没有办法的话, :) )。
--> 2. 尽量不要通过SQL语句来查询,而要使用存储过程、自定义函数等数据库自带方法来提高性能。
--> 3. 查询数据库主要有两种方法
第一种,
Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open strSQL, DBConnection
RS.Close
Set RS = Nothing
DBConnection.Close
Set DBConnection = Nothing
RS.Open strSQL, DBConnection
RS.Close
Set RS = Nothing
DBConnection.Close
Set DBConnection = Nothing
第二种,
set CmdSP = Server.CreateObject("ADODB.Command")
CmdSP.ActiveConnection = DBConnection
CmdSP.CommandText = "dbo.SPName"
CmdSP.CommandType = adCmdSPStoredProc
Set adoRS = CmdSP.Execute
adoRS.Close
set adoRS = nothing
set CmdSP = nothing
DBConnection.Close
Set DBConnection = Nothing
CmdSP.ActiveConnection = DBConnection
CmdSP.CommandText = "dbo.SPName"
CmdSP.CommandType = adCmdSPStoredProc
Set adoRS = CmdSP.Execute
adoRS.Close
set adoRS = nothing
set CmdSP = nothing
DBConnection.Close
Set DBConnection = Nothing
第二种方法功能比较强,可以调用存储过程来进行查询。但是一定要注意将所有用到的Connection和Command都释放掉。如果Command没有释放掉的话,那么下次建立Command并且使用相同的DBConnection就会出错。