2010-09-08 121 views
11

案例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两者的表具有相同的结构是指在使用列和列的数目仅区别在哪里条件也是在选择相同和列也是相同的。区别在于表B只有一些未使用的列,这些未在select中使用,并且在这种情况下条件为 两种查询的性能是否有差异?

回答

9

SELECT返回较少的列的主要的好处是,SQL也许能够避免从表/集群读书,而是,如果它能够获取所有从指数selected数据(无论是作为索引列和/或覆盖指数情况下的包含列)。谓词中使用的列,即您的示例中的f必须位于索引的索引列中。

在一般情况下,也有在从一个SELECT返回更少列的次级益处,因为这将减少任何I/O开销,尤其是如果在数据库服务器和应用程序之间的速度较慢的网络消费数据 - 即只返回实际需要的色谱柱是很好的做法,并且避免使用SELECT *

编辑:为响应OP的更新的帖子:

没有索引可言,这两个查询会做表扫描。由于Table B的列数少于Table A,因此B上每页的行数(密度)会更高,因此B会稍微快一点,因为SQL需要获取更少的页面。

然而,具有索引按照以下

  • 指数上A(f) INCLUDE (b,c,d)
  • 指数上B(f) INCLUDE (b,c,d)

性能应为查询(假设两个表中相同的数据)相同,给定SQL将会触及现在具有相似列宽和行密度的索引。

编辑

一些其他的计划:在B(f)

  • 指数没有其他按键或INCLUDE列,或用一组INCLUDE列的不完整的(即一个或多个b, c or d缺失):

SQL Server将可能需要做一个Key or RIDLookup因为即使使用了索引,就会有必要“加入”回到谈判桌来恢复丢失select子句中的列。 (查找类型取决于表中是否存在一个群集PK与否)上B(f,b,c,d)

+1

+供索引使用 – 2010-09-08 12:25:01

2

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

你在谈论你在哪里比较列表在两个表中的位置的情况就像比较苹果和桔子差不多,因为除了苹果之外还有很多不同的变量列位置。

1

取决于表的宽度(每行字节数),表中有多少行,以及查询使用的列是否有索引。没有这些信息,没有确定的答案。但是,表格中的列越多,机会就越宽。但是正确索引的效果比表格大小的效果要重要得多。

+0

+供索引使用 – 2010-09-08 12:24:43

2

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

  • 获取你所需要的
  • 避免在同一个表中第二个数据库查询相同的行
  • 使用索引的选择列(S)(WHERE子句约束部)
  • 限制列,如果你不需要它们来提高数据服务器的内存效率/分页
+0

这就是说,SQL Server有时会抓住内存中的整个表/索引,然后将它编号为静音 - 尝试查找引用。 – 2010-09-08 13:27:56

4

测试一下,看看!

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

你甚至不能保证与较少列的表会更快 - 如果打扰你那么尝试一下,看看。

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

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

SQL服务器只尝试读取它绝对需要的数据,但它总是会一次加载整个页面(8 KB)。即使输入到查询所需的数据量完全相同,如果数据分布在更多页面上,则需要更多的IO。这就是说,SQL服务器的数据访问效率非常高,所以除非出现极端情况,否则您不太可能看到对性能的显着影响。

此外,您的查询也可能会针对索引而非表格运行,因此如果索引完全相同,则更改可能为。

+2

+1为测试它并看到;-) – 2010-09-08 12:53:12