“set rs = conn.execute(sql)”如何实际工作?

时间:2011-11-27 18:12:18

标签: sql performance asp-classic

我目前正在尝试提高ASP Classic应用程序的性能,而且我正在改进SQL事务。

我一直在阅读http://www.somacon.com/p236.php

所以,我的问题是: 第set rs = conn.execute(sql)行如何实际运作?

我相信该行定义了一个名为rs的变量,并通过SQL语句(fx select * from users)绑定从数据库收集的所有数据。 然后我实际上可以把数据库连接扔到地狱,如果我愿意,重新定义我的sql变量,这是真的吗?

如果这是真的,我会通过执行这样的代码来获得最佳性能:

set conn = server.createobject("adodb.connection")
dsn = "Provider = sqloledb; Data Source = XXX; Initial Catalog = XXX; User Id = XXX; Password = XXX"

conn.open dsn
sql = "select id, name from users"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

conn.open dsn
sql = "select id from logins"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

conn.open dsn
sql = "select id, headline from articles"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

set conn = nothing

在本例中,我每次执行sql事务时都会打开和关闭连接。

这是个好主意吗?

2 个答案:

答案 0 :(得分:3)

  

这是个好主意吗?

不,但不是因为路加指出的原因。实际情况是ADODB无论如何都会缓存连接,因此打开和关闭连接并不是那么昂贵。然而,问题来自你似乎对记录集行为的错误信息......

你对Lukes的评论回答: -

  

但它是正确的,它在执行时将所有数据存储在变量中?

除非您仔细配置记录集返回为静态客户端游标,否则您必须确保光标已完全填充。只有这样才能断开记录集与连接的连接,并继续使用记录集中的数据。

默认情况下,SQL Server连接将提供一个简单的“fire-hose”行集(这实际上不是一个游标)数据是从查询原始传递的,只有少量缓冲发生在传入的记录中无法向后导航。

最小化连接所需时间的最有效方法是使用ADODB Recordset的GetRows方法。这会将所有行吸收到二维变体数组中。获得此阵列后,您可以省去记录集和连接。

最大限度地减少服务器上维护的连接数量,但实际上在现代硬件上并不是大多数应用程序的真正问题。真正的问题是正在进行的查询维护数据库中的锁定的时间。通过快速使用和关闭记录集,可以最大限度地减少锁定时间。

但要谨慎。权衡是对Web服务器上内存的需求增加。你需要小心,不仅仅是将一个瓶颈转移到另一个瓶颈。那说你可以做很多事情。使用64位O / S并在其中填充大量内存或将Web服务器扩展到服务器场。

答案 1 :(得分:0)

不,打开和关闭连接成本很高。打开它,像你一样重用记录集,然后关闭它。