我有一个表 1 lac 行,有 50 列。我知道我必须根据主键准确选择一行和一列。那么我必须使用什么查询
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX
或者
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX
所以任何人请告诉我哪种方法更好以及为什么。从性能上看。假设此查询在可扩展的应用程序中频繁运行。请说明原因。
我有一个表 1 lac 行,有 50 列。我知道我必须根据主键准确选择一行和一列。那么我必须使用什么查询
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX
或者
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX
所以任何人请告诉我哪种方法更好以及为什么。从性能上看。假设此查询在可扩展的应用程序中频繁运行。请说明原因。
理想的方法是
SELECT yourcolumn FROM yourtable WHERE yourcondition
它将产生更少的网络流量,并且更准确地说明您的要求。
此外,如果您的表具有某些类型的列,则可以避免对它们进行昂贵的查询,从而提高性能
这完全取决于您的索引,但是,在我能想到的大多数情况下,窄选择 ( 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
最佳索引将打开<IND_COL_NAME>
,其中包括COL_NAME
。由于您说这<IND_COL_NAME>
是您的主键,因此它将具有很高的选择性。
不要*
用于指定字段,始终准确指定您想要的字段。
获取单行时,数据大小差异很小,但您通常应该只获取减少带宽使用所需的数据。另一方面是使用*
增加了对表格设计的依赖。如果您稍后向表中添加更多字段,则查询也会获取这些字段,这可能意味着您获得的数据多于缓冲区的容量,并且您会遇到异常。
当您从表中获取单个字段(或几个字段)时,会有特定的性能优势。如果您有一个包含所需字段的键的索引作为包含的列,则可以仅从索引运行查询,甚至不触及表本身。