我想知道,在我的情况下,以下哪个示例最适合关闭记录集对象?经典ASP - 何时关闭记录集
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
我希望我已经解释自己不够好,这不是太愚蠢了。
UPDATE
对于那些谁认为我的查询可以进行修改,以避免N + 1问题(第二查询),那就是:
这是一个在线照片库。我有两张桌子; “photoSearch”和“照片”。第一个“photoSearch”只有几列,包含照片的所有可搜索数据,如“photoID”,“标题”,“标题”,“人物”,“dateCaptured”和“关键字”。它有一个多列全文索引(标题,标题,人物,关键字)。第二个表格“照片”包含所有照片数据;高度,宽度,版权,标题,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”表,它已经存在 - 这不是我的应用程序。如果我尝试加入这两个表以失去第二个查询,那么我会一起丢失索引,导致很长时间 - 所以我无法使用全文连接。这似乎是最快的方法。如果不是全文和加入问题,我已经将这两个查询结合起来了。
哇!这个新的查询是有道理的,它的工作。我在MySQL Workbench中测试,它非常快。我需要将它添加到我的应用程序,以查看它是否能够加快速度。我有一个问题;我会在哪里将INNER JOIN放入此查询中?像这个; LEFT JOIN(photoPeople AS pp INNER JOIN people as pe pe.peopleID = pe.PeopleID) ON p.photoID = pp.photoID? – TheCarver 2012-07-08 22:06:52
@PaparazzoKid在使用MySQL时,您不必使用INEER JOIN,LEFT JOIN等。您可以使用“,”(逗号运算符)连接多个表并为这些表伪名。即:(“SELECT t1.name,t2.name FROM very_long_table_name_table1 AS t1,very_long_table_name_table2 AS t2 WHERE t1.id = t2.id”) – htbasaran 2012-07-08 22:54:34
噢,这是一个扳手在作品中。对于MySQL,我一直使用LEFT,RIGHT,JOIN或INNER JOINS - 我需要阅读相关内容。我使用LEFT的原因是我想要加入的表格并不总是有匹配的记录。你的方法会这样吗? – TheCarver 2012-07-08 23:14:16