2017-08-02 18 views
0

我的问题是关于SQL服务器表上的性能。当表有很多列时SQL Server的性能

假设我有一个包含许多列的表格,例如30列,索引列为1列。这个表格大约有30,000行。

如果我执行选择其选择索引列,和一个多个,例如这样的:

SELECT IndexedColumn, column1 
FROM table 

将这个比执行对仅具有2列的表相同的选择,和做慢a SELECT * ...

所以基本上,如果我没有从额外的列中检索数据,额外列的存在是否会减慢select查询事件?

+0

如果'column1'不是你索引的一部分,'SELECT'没有'WHERE'根本不会使用该索引。它必须使用聚簇索引,是的,扫描30列的聚簇索引比扫描2列中的一个要慢。这就是说 - 任何足够强壮的服务器都会扫描30,000行任何可能忽略不计的时间,所以除非你每秒选择几次你不可能注意到的所有行。如果'column1' *是您的索引的一部分(即覆盖),那么聚集索引不会被命中,并且表中的列数是不相关的。考虑'INCLUDE'。 –

+0

埃里克Lippert写了一个很好的[性能咆哮](https://ericlippert.com/2012/12/17/performance-rant/) –

回答

2

由于您不必为最终客户端(SSMS或其他应用程序)打印/传递其余信息,因此在流程的最后阶段会有细微的差异。

当执行基于聚簇索引的读取时,所有列(无BLOB)都保存在同一页面集中,以读取数据,您必须访问同一组页面。

如果您在之后的列列表中有一个非聚簇索引,那么它们将保存在它们自己的数据页结构中(因此读取的次数会更少),您会看到性能提高。

0

假设您在两种情况下在表中定义主键时使用由SQL Server创建的默认集群索引,则no,这两种情况之间不应该有任何性能差异。也许值得检查一下,并生成一个实际的执行计划,看看自己? - 实际上不确定上面是否为真,因为这是行存储,第一个表不会在每个页面上放入足够多的行,所以在读取数据时会遭受更多的IO /磁盘开销。