我有一个有50列的表1lac行。我知道我必须根据主键恰好选择一行和一列。那么我必须使用什么查询
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 或
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 所以请任何人告诉我哪种方法更好,为什么。从性能的角度来看。假设此查询在可伸缩应用程序中频繁运行。请说明原因。
发布于 2012-08-07 18:51:27
理想的方法是
SELECT yourcolumn FROM yourtable WHERE yourcondition它将生成较少的网络流量,并且更准确地表达了您的需求。
此外,如果您的表包含某些类型的列,则可以避免对这些列进行代价高昂的查询,从而提高性能
发布于 2012-08-07 18:54:18
这完全取决于您的索引,然而,在我能想到的大多数情况下,窄选择(SELECT COL_NAME)会执行得更好,因为它为SQL提供了更多关于如何获取数据的“选项”。
一般来说,对于任何给定的查询,最好的情况是有一个索引,它允许对WHERE条件进行索引查找,但也包括SELECT中需要的列。这样,RDBMS只需要使用索引来获得查询结果-它根本不需要底层表。
在MS SQL Server中,覆盖索引将允许您执行此操作。
这是不可能的
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 在许多情况下都是最优的,因为除非您有一个包含表中所有列的IND_COL_NAME索引(除非<IND_COL_NAME>是您的聚集索引,否则这将是存储上的浪费)。否则,这意味着查询将需要查找<IND_COL_NAME>的索引,然后连接回物理表以检索列数据的其余部分。
因此,对于您的狭义查询
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX最好的索引应该在包含COL_NAME的<IND_COL_NAME>上。既然您说<IND_COL_NAME>是您的主键,那么它将是高度选择性的。
发布于 2012-08-07 18:57:20
不要使用*来指定字段,始终准确地指定您想要的字段。
在获取单行时,数据大小差异很小,但通常应该只获取减少带宽使用所需的内容。另一方面,使用*会增加对表设计的依赖。如果您稍后向表中添加了更多字段,则查询也会获取这些字段,这可能意味着您获得的数据超过了缓冲区的容量,并且您会得到一个异常。
当您从表中获得单个字段(或几个字段)时,会有特定的性能优势。如果您有一个关键字的索引,并且想要的字段是包含在其中的列,那么查询只能从索引运行,甚至不能触及表本身。
https://stackoverflow.com/questions/11844318
复制相似问题