2012-08-07 81 views
0

我有一个表1 lac行与50列。我知道我必须根据主键精确选择一行和一列。所以我必须使用何种查询要么SQL性能分析

SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

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

回答

0

理想的方法是

SELECT yourcolumn FROM yourtable WHERE yourcondition 

它会产生更少的网络流量,并为您的要求更确切的说法。

此外,如果你的表有某些类型的列,它避免了它们的昂贵的查询,从而给你更高的性能

+0

但是为什么我可以从依赖性的角度提出问题*更好。还有其他一些我也指出过的表现。这种方法会比另一种更快 – 2012-08-07 10:54:28

+0

我仍在寻求正确答案。与有效的原因 – 2012-08-08 13:56:28

0

这一切都取决于你的指标,但是,在我能想到的大多数情况下,窄选(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>是你的主要关键,它将是高度选择性的。

+0

请看看最新的评论 – 2012-08-07 12:24:55

0

请勿使用*指定字段,请始终指定所需的字段。

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

当您从表格中获得单个字段(或几个字段)时,会有特定的性能优势。如果您的密钥的索引中包含想要的字段作为包含列,那么查询可以仅从索引运行,甚至不涉及表本身。

+0

据我所知,(Oracle)将数据存储在DATA文件中。这被进一步分割为DB_BLOCK和OS_BLOCK。正如我所说的那样有索引,所以会有确切的行位置。然后到达DESIRED行后,他们必须扫描所有的COLUMN(最糟糕的情况)。那么表现在哪里。在他们两个之间其他更多的数据块在*的情况下。 – 2012-08-07 11:17:44

+0

@PavanSharma:Oracle在索引中没有包含列,因此您可以使用键和想要的字段进行索引。如果你有这些,所有需要的信息都在索引中,并且根本不需要从数据文件中读取。 – Guffa 2012-08-07 15:51:40

+0

在Oracle ROW中,数据存储在[{COL_SIZE,COL_VALUE},{COL_SIZE,COL_VALUE},{COL_SIZE,COL_VALUE} {COL_SIZE,COL_VALUE} ...]中。并且索引与包含具有ROWID的索引键值(ROWID是其存储在数据文件中的ROW的物理位置)的表相关联。当我们使用索引列选择数据时,直接在所需的物理位置(ROWID)上选择数据,然后我认为筛选记录,用于列。那么NARROW语句如何提高性能? – 2012-08-08 05:46:59