我想知道,在我的情况下,以下哪个示例最适合关闭记录集对象?
1)
这个关闭循环内的对象,但在下一个移动时打开一个新对象。如果有 1000 条记录,这将打开一个对象 1000 次并关闭它 1000 次。这是我通常会做的:
SQL = " ... "
Set rs1 = conn.Execute(SQL)
While NOT rs1.EOF
SQL = " ... "
Set rs2 = conn.Execute(SQL)
If NOT rs2.EOF Then
Response.Write ( ... )
End If
rs2.Close : set rs2 = Nothing
rs1.MoveNext
Wend
rs1.Close : Set rs1 = Nothing
2)
这个例子是我想知道的。将对象闭包 (rs2.close) 保存到循环完成后会提高还是降低性能?如果有 1000 条记录,这将打开 1000 个对象,但只会关闭一次:
SQL = " ... "
Set rs1 = conn.Execute(SQL)
While NOT rs1.EOF
SQL = " ... "
Set rs2 = conn.Execute(SQL)
If NOT rs2.EOF Then
Response.Write ( ... )
End If
rs1.MoveNext
Wend
rs1.Close : Set rs1 = Nothing
rs2.Close : set rs2 = Nothing
我希望我已经很好地解释了自己,而且这不是太愚蠢。
更新
对于那些认为可以修改我的查询以避免 N+1 问题(第二次查询)的人,这里是:
这是一个在线照片库。我有两张桌子;“照片搜索”和“照片”。第一个,“photoSearch”,只有几列,包含照片的所有可搜索数据,例如“photoID”、“headline”、“caption”、“people”、“dateCaptured”和“keywords”。它有一个多栏全文索引(标题、标题、人物、关键字)。第二个表“照片”包含所有照片数据;高度、宽度、版权、标题、ID、日期等等。两者都有 500K+ 行,标题和标题字段有时会返回 2000+ 个字符。
这大概是查询现在的样子:(注意事项:我不能将连接与全文搜索一起使用,因此关键字存储在一列中 - 在“非规范化”表中。此外,这种伪代码作为我的应用程序代码在别处 - 但它很接近)
SQL = "SELECT photoID FROM photoSearch
WHERE MATCH (headline, caption, people, keywords)
AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE)
AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"' LIMIT 0,50;"
Set rs1 = conn.Execute(SQL)
While NOT rs1.EOF
SQL = "SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more FROM photos LEFT JOIN events AS e USING (eventID) LEFT JOIN location AS l USING (locationID) WHERE photoID = "&rs1.Fields("photoID")&";"
Set rs2 = conn.Execute(SQL)
If NOT rs2.EOF Then
Response.Write ( .. photo data .. )
End If
rs2.Close
rs1.MoveNext
Wend
rs1.Close
测试时,在自己的表“photoSearch”上拥有全文索引,而不是在大表“photos”上,似乎在一定程度上提高了速度。我没有添加“photoSearch”表,它已经存在 - 这不是我的应用程序。如果我尝试加入两个表以丢失第二个查询,我会一起丢失我的索引,从而导致很长时间 - 所以我不能使用全文连接。这似乎是最快的方法。如果不是因为全文和连接问题,我早就将这两个查询结合起来了。