gpt4 book ai didi

sql - "set rs = conn.execute(sql)"实际上是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 06:06:31 25 4
gpt4 key购买 nike

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

我从 http://www.somacon.com/p236.php 读了一点

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

我相信该行定义了一个名为 rs 的变量,并绑定(bind)了通过 SQL 语句(fx select * from users)从数据库收集的所有数据。
然后,如果我愿意,我实际上可以将数据库连接扔到 hell 并重新定义我的 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 事务时都会打开和关闭连接。

这是一个好主意吗?

最佳答案

Is this a good idea?



不,但不是因为卢克指出的原因。现实情况是 ADODB 无论如何都会缓存连接,因此打开和关闭连接毕竟不是那么昂贵。但是,问题来自您似乎对记录集行为的错误信息......

从您对卢克斯的评论中回答:-

But it is correct, that it stores all the data in the variable when executed?



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

默认情况下,SQL 服务器连接将传递一个简单的“消防软管”行集(这甚至不是真正的游标)数据是从查询中原始传递的,传入记录只发生少量缓冲,你不能向后导航。

将连接所需时间减至最少的最有效方法是使用 ADODB 记录集的 GetRows方法。这会将所有行吸进一个二维变体数组中。有了这个数组,您就可以省去记录集和连接。

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

不过要注意一点。权衡是对 Web 服务器上内存的需求增加。您需要小心,不要只是将一个瓶颈转移到另一个瓶颈。也就是说,你可以做很多事情。使用 64 位操作系统并在其中填充大量内存,或者将 Web 服务器扩展到场中。

关于sql - "set rs = conn.execute(sql)"实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com