我应该在查询中使用“maxrows”吗? ColdFusion / SQL

时间:2011-03-10 20:51:11

标签: database coldfusion cfquery

在搜索带有数字主键的行时是否需要使用maxrows =“1”?

<cfquery maxrows="1">  
   select *
   from table
   where RowID = #NumericVariable#
</cfquery>

如果包含或排除maxrows,ColdFusion是否有某种SQL绑定或其他任何使其更好/更快/更高的东西?

5 个答案:

答案 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>

只是想指出这个背景。