我分析了SqlCommand
的{{3}},看到它运行正常(请参阅CompleteExecuteScalar
方法)。但我不确定我是否应该在查询中使用top 1
。例如,我有select name from Person
,表Person
包含很多记录。我应该将qry修改为select top 1 name from Person
吗?或者我可以保持qry原样,它不会影响性能/内存等?我担心服务器可以在输出之前缓冲一些数据。
答案 0 :(得分:6)
如果您只想从数据库中获取一行,则无论您是通过TOP 1
还是ExecuteScalar
传递数据,都必须在查询中添加ExecuteReader
。
你不应该阅读源代码来得出这样的结论。事实上,实现方式命令受封装限制,调用类不应该根据命令的确切实现做出决定。
相反,我的想法是数据库是稀缺资源,应该在数据吞吐量和相关措施方面得到最佳利用。这包括向数据库指示只需要一行并完成它。让较低层(如命令实现和数据库本身)了解如何使用该信息以获得最佳性能。
答案 1 :(得分:2)
ExecuteScalar
获取第一行的第一列值。因此,如果您在查询中添加TOP 1
,则无法发挥作用。但是,如果您希望重复值并且需要一个特定值(为了速度),建议添加TOP 1
。一个这样合理的场景是,您正在重用一些脚本,该脚本返回一组或多行,其中包含有关特定客户的客户信息,前提是您的第一列是CustomerID或任何主键。