列数是否会影响查询性能?

时间:2010-09-08 12:19:11

标签: sql-server

案例1:我有一个包含30列的表,我使用where子句中的4列进行查询。

案例2:我有一个包含6列的表,我在where子句中使用4列进行查询。

两种情况下的表现有何不同?

例如我有桌子

table A
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10),
  g varchar(10),
  h varchar(10)

}

SELECT b,c,d
FROM A
WHERE f='foo'

create table B
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10)

}

SELECT b,c,d
FROM B
WHERE f='foo'

A和B表具有相同的结构意味着在where条件也相同且列中的列也相同时使用的列数和列数的差异。区别在于表B只有一些未使用的列,这些列未在select和where条件中使用 在这种情况下,两个查询的性能是否存在差异?

6 个答案:

答案 0 :(得分:11)

  

表中的总列数是否会影响性能(如果选择了相同的列子集,并且表中没有索引)

,根本没有索引,两个查询(表A和表B)都将执行表扫描。鉴于Table B的列数少于Table A,每页的行数(密度)会在B上更高,因此B会略微加快,因为需要的页数更少取出。

但是,鉴于您的查询形式为:

SELECT b,c,d
FROM X
WHERE f='foo';

查询的性能将由列f上的索引主导,而不是基础表中的列数。

对于这个确切的查询,最快的性能将来自以下索引:

  • A(f) INCLUDE (b,c,d)
  • 上的索引
  • B(f) INCLUDE (b,c,d)
  • 上的索引

在这两种情况下,两个查询的性能应该相同(假设两个表中都有相同的数据),因为SQL会命中现在具有相似列宽和行密度的索引,而不需要原始表中的任何其他数据

  

select中的列数是否影响查询性能?

SELECT中返回较少列的主要好处是SQL可能能够避免从表/群集中读取,而是,如果它可以检索所有selected 1}}来自索引的数据(在covering index的情况下,作为索引列和/或包含的列)。

显然,谓词中使用的列(过滤器),即示例中的f必须位于索引的索引列中,并且必须足够{{ 3}},以便首先使用索引。

SELECT返回较少的列时,还有次要优势,因为这会减少任何I / O开销,尤其是在数据库服务器和消费数据的应用程序 - 即最好只返回您实际需要的列,并避免使用SELECT *

修改

其他一些计划:

  • B(f)上的索引,没有其他键或INCLUDE列,或者INCLUDE列不完整(即b, c or d中的一个或多个列丢失):< / LI>

SQL Server可能需要执行selective Key or RID,因为即使使用了索引,也需要“连接”回表以检索select中缺少的列条款。 (查找类型取决于表是否具有聚簇PK)

  • B(f,b,c,d)
  • 上的直接非聚集索引

这仍然非常高效,因为将使用索引并避免使用表,但是Lookup,因为索引树的密度将因索引中的其他键列而减少。

答案 1 :(得分:4)

除非你有一个非常宽的列集差异而没有使用索引(因此是一个表扫描),你应该看到性能上的差异很小。话虽如此,为了满足您的需求,返回尽可能少的列总是有用/有益的。这里的问题是,通过返回所需的列而不是为其他列提取第二个数据库,可以获得更大的好处。

  • 得到你需要的东西
  • 避免对同一行的同一个表进行第二次数据库查询
  • 在select列上使用索引(WHERE子句限制器)
  • 限制列,如果您不需要它们来增强数据服务器内存效率/分页

答案 2 :(得分:4)

测试并查看!

会有性能差异,但99%的时间你都不会注意到它 - 通常你甚至无法检测到它!

你甚至不能保证列数较少的表会更快 - 如果它困扰你那么试试看看。

技术垃圾:(从Microsoft SQL Server的角度来看)

假设在所有其他方面(索引,行数,6个公共列中包含的数据等等)表是相同的,那么唯一真正的区别是较大的表分布在更多磁盘/内存中的页面。

SQL服务器只尝试读取它绝对需要的数据,但它总是一次加载整个页面(8 KB)。即使具有完全相同的数量,也需要数据作为查询的输出,如果该数据分布在更多页面上,则需要更多IO。

也就是说,SQL服务器的数据访问效率极高,因此除极端情况外,您不太可能看到对性能的显着影响。

此外,您的查询也可能会针对索引而不是表格运行,因此,如果索引的大小完全相同,则更改可能 0

答案 3 :(得分:2)

根据列位置不会有性能差异。现在桌子的构造是一个不同的故事,例如行数,索引,列数等。

您所谈论的场景比较两个表中列的位置,就像几乎将苹果与橙子进行比较一样,因为除了列位置之外还有很多不同的变量。

答案 4 :(得分:1)

取决于表的宽度(每行的字节数),表中的行数以及查询使用的列是否有索引。没有这些信息,没有明确的答案。但是,表中的列越多,它的可能性就越大。但是适当指数的影响比表格大小的影响要大得多。

答案 5 :(得分:0)

自从您指定使用WHERE子句以来,它取决于返回的行数。如果您的WHERE子句中的值为UNIQUE或PRIMARY KEY,则几乎不存在差异。 您可以在SELECT语句前面使用EXPLAIN ANALYZE来查看计划时间和执行时间值,然后可以比较查询。