使用 SqlCommand.ExecuteScalar() 时是否需要放 top 1
Do I need to put top 1 when using SqlCommand.ExecuteScalar()
我分析了 SqlCommand
的 the code,发现它运行良好(参见 CompleteExecuteScalar
方法)。但我不确定我是否应该在查询中使用 top 1
。例如我有 select name from Person
和 table Person
包含很多记录。我应该将 qry 修改为 select top 1 name from Person
吗?或者我可以让 qry 保持原样,它不会影响 performance/memory 等?恐怕服务器可以在输出之前缓冲一些数据。
如果您只想从数据库中获取一行,您绝对应该在查询中放入 TOP 1
,无论您是通过 ExecuteScalar
还是 ExecuteReader
传递数据实例.
你不应该阅读源代码得出这样的结论。事实上,命令的实现方式是封装的,调用类不应该根据命令的确切实现来做出决定。
相反,我的想法是数据库是稀缺资源,应该在数据吞吐量和相关措施方面得到最佳利用。这包括向数据库指示正好需要一行并完成它。让较低层(例如命令实现和数据库本身)查看如何使用该信息以获得最佳性能。
ExecuteScalar
获取第一行的第一列值。因此,如果您将 TOP 1
添加到查询中,这不会有什么不同。但是,如果您期望重复值并且需要一个特定值(为了速度),建议添加 TOP 1
。一个这样的合理场景是,您正在重用一些脚本,其中 returns 一组或几行包含有关特定客户的客户信息,前提是您的第一列是 CustomerID 或任何主键。
我分析了 SqlCommand
的 the code,发现它运行良好(参见 CompleteExecuteScalar
方法)。但我不确定我是否应该在查询中使用 top 1
。例如我有 select name from Person
和 table Person
包含很多记录。我应该将 qry 修改为 select top 1 name from Person
吗?或者我可以让 qry 保持原样,它不会影响 performance/memory 等?恐怕服务器可以在输出之前缓冲一些数据。
如果您只想从数据库中获取一行,您绝对应该在查询中放入 TOP 1
,无论您是通过 ExecuteScalar
还是 ExecuteReader
传递数据实例.
你不应该阅读源代码得出这样的结论。事实上,命令的实现方式是封装的,调用类不应该根据命令的确切实现来做出决定。
相反,我的想法是数据库是稀缺资源,应该在数据吞吐量和相关措施方面得到最佳利用。这包括向数据库指示正好需要一行并完成它。让较低层(例如命令实现和数据库本身)查看如何使用该信息以获得最佳性能。
ExecuteScalar
获取第一行的第一列值。因此,如果您将 TOP 1
添加到查询中,这不会有什么不同。但是,如果您期望重复值并且需要一个特定值(为了速度),建议添加 TOP 1
。一个这样的合理场景是,您正在重用一些脚本,其中 returns 一组或几行包含有关特定客户的客户信息,前提是您的第一列是 CustomerID 或任何主键。