首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL性能分析

SQL性能分析
EN

Stack Overflow用户
提问于 2012-08-07 18:50:04
回答 3查看 79关注 0票数 0

我有一个有50列的表1lac行。我知道我必须根据主键恰好选择一行和一列。那么我必须使用什么查询

代码语言:javascript
复制
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

代码语言:javascript
复制
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

所以请任何人告诉我哪种方法更好,为什么。从性能的角度来看。假设此查询在可伸缩应用程序中频繁运行。请说明原因。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-07 18:51:27

理想的方法是

代码语言:javascript
复制
 SELECT yourcolumn FROM yourtable WHERE yourcondition

它将生成较少的网络流量,并且更准确地表达了您的需求。

此外,如果您的表包含某些类型的列,则可以避免对这些列进行代价高昂的查询,从而提高性能

票数 0
EN

Stack Overflow用户

发布于 2012-08-07 18:54:18

这完全取决于您的索引,然而,在我能想到的大多数情况下,窄选择(SELECT COL_NAME)会执行得更好,因为它为SQL提供了更多关于如何获取数据的“选项”。

一般来说,对于任何给定的查询,最好的情况是有一个索引,它允许对WHERE条件进行索引查找,但也包括SELECT中需要的列。这样,RDBMS只需要使用索引来获得查询结果-它根本不需要底层表。

在MS SQL Server中,覆盖索引将允许您执行此操作。

这是不可能的

代码语言:javascript
复制
SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX  

在许多情况下都是最优的,因为除非您有一个包含表中所有列的IND_COL_NAME索引(除非<IND_COL_NAME>是您的聚集索引,否则这将是存储上的浪费)。否则,这意味着查询将需要查找<IND_COL_NAME>的索引,然后连接回物理表以检索列数据的其余部分。

因此,对于您的狭义查询

代码语言:javascript
复制
SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX

最好的索引应该在包含COL_NAME<IND_COL_NAME>上。既然您说<IND_COL_NAME>是您的主键,那么它将是高度选择性的。

票数 0
EN

Stack Overflow用户

发布于 2012-08-07 18:57:20

不要使用*来指定字段,始终准确地指定您想要的字段。

在获取单行时,数据大小差异很小,但通常应该只获取减少带宽使用所需的内容。另一方面,使用*会增加对表设计的依赖。如果您稍后向表中添加了更多字段,则查询也会获取这些字段,这可能意味着您获得的数据超过了缓冲区的容量,并且您会得到一个异常。

当您从表中获得单个字段(或几个字段)时,会有特定的性能优势。如果您有一个关键字的索引,并且想要的字段是包含在其中的列,那么查询只能从索引运行,甚至不能触及表本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11844318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档