搜索具有数字主键的行时是否需要使用 maxrows="1" ?
<cfquery maxrows="1">
select *
from table
where RowID = #NumericVariable#
</cfquery>
如果包含或排除 maxrows,ColdFusion 是否具有某种 SQL 绑定或其他任何使其更好/更快/更好的东西?
搜索具有数字主键的行时是否需要使用 maxrows="1" ?
<cfquery maxrows="1">
select *
from table
where RowID = #NumericVariable#
</cfquery>
如果包含或排除 maxrows,ColdFusion 是否具有某种 SQL 绑定或其他任何使其更好/更快/更好的东西?
如果表结构正确(即您限制的字段是主键),那么限制为一个是多余的。根据定义,主键唯一标识一行。
maxrows限制查询变量从数据库返回后的结果数。
如果您只返回一个结果,那么这不会对您的查询性能产生任何影响。
ColdFusion 允许您使用 CFQUERYPARAM 标记传递绑定参数。
例如:
<cfquery name="q">
SELECT property1, property2, property3
FROM yourTable
WHERE RowID = <cfqueryparam value="#NumericVariable#" cfsqltype="CF_SQL_INTEGER" />
</cfquery>
您可以希望通过提供绑定参数并指定要返回的属性来提高数据库的速度。这可能允许更好的查询缓存和性能改进,具体取决于您使用的数据库引擎。
我会补充说,使用 CFQUERYPARAM 通常比让变量不合格并可能受到 SQL 注入攻击更安全。
我会测试一下:
为 10 个不同的 RowID 值运行上面的代码,并将其与运行带有 maxrows 条件的代码进行比较。如果您发现后者的执行时间总是更好,那么您就有了明确的答案!
其工作原理是 cfquery 仍会尝试查询所有适合您的 where 子句的表行,但它只返回 x 结果。
所以对性能来说并不是很好。
至少在 SQL Server 中,另一种替代方法是 SET ROWCOUNT # 命令,它实际上限制了它返回的记录数。但是,如果您在 cfadmin 中检查持久性,这可能会影响所有 cfqueries。
或者在mysql中有limit命令。
我希望有更好的解决方案,但没有。
不,这完全没有必要。虽然具有真实数据库查询的 maxrows 可能会受到质疑并被 SQL 限制子句 (mySQL) 取代,这也优化了数据库的性能,使用“查询的查询”,maxrow 参数是限制结果集的唯一可能性,因为查询的查询不支持限制子句。例如:
<!--- get the newest file date from an existing query --->
<cfquery name="oldest" dbtype="query" maxrows="1">
SELECT dateLastModified FROM dirQuery ORDER BY dateLastModified DESC
</cfquery>
只是想指出这个背景。