在搜索带有数字主键的行时是否需要使用maxrows =“1”?
<cfquery maxrows="1">
select *
from table
where RowID = #NumericVariable#
</cfquery>
如果包含或排除maxrows,ColdFusion是否有某种SQL绑定或其他任何使其更好/更快/更高的东西?
答案 0 :(得分:4)
如果表格结构正确(即您要限制的字段是主键),则限制为1是多余的。根据定义,主键唯一地标识一行。
答案 1 :(得分:1)
maxrows 限制从数据库返回后查询变量中的结果数。
如果您只返回一个结果,那么这对查询的性能完全没有任何影响。
ColdFusion允许您使用CFQUERYPARAM标记传递绑定参数。
例如:
<cfquery name="q">
SELECT property1, property2, property3
FROM yourTable
WHERE RowID = <cfqueryparam value="#NumericVariable#" cfsqltype="CF_SQL_INTEGER" />
</cfquery>
您可以通过提供绑定参数并指定要返回的属性来提高数据库的速度。这可能允许更好的查询缓存和性能改进,具体取决于您使用的数据库引擎。
我添加它通常比使用CFQUERYPARAM更安全,而不是让变量不合格并且可能对SQL注入攻击开放。
答案 2 :(得分:0)
我会测试:
运行上面的代码,因为它适用于10个不同的RowID值,并将其与运行带有maxrows条件的代码进行比较。如果您发现后者的执行时间总是更好,那么您有明确的答案!
答案 3 :(得分:0)
如何工作,是cfquery仍然试图查询适合你的where子句的所有表行,但它只返回x结果。
所以表现不太好。
至少在SQL Server中的另一种选择是SET ROWCOUNT#命令,它实际上限制了它返回的记录数。但是,如果您在cfadmin中检查了持久性,则会影响所有cfqueries。
或者在mysql中有limit命令。
我希望有更好的解决方案,但没有。
答案 4 :(得分:0)
不,完全没有必要。虽然具有真实数据库查询的 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>
只是想指出这个背景。