SQL Server性能和字段顺序

6

创建表格时字段的顺序是否会影响对表格命令的性能? 如果答案是肯定的,有人可以讨论一下吗?

例如,我创建了一个如下所示的表格:

create table Software(int id,alpha datetime,beta datetime,title nvarchar(100),stable datetime,description nvarchar(200) )

如果我将其更改为

create table Software(int id,alpha datetime,beta datetime,stable datetime,description nvarchar(200),title nvarchar(100) )

有性能影响吗?

清楚吗?


我不能完全回答这个问题。但是我想补充一下,在我多年的SqlServer开发经验中,由于非常难以理解的原因(如添加新字段),有很多查询突然变得“低效”(即索引未被使用)。 - M Schenkel
2
@M Schenkel:这些原因并不是难以理解的:十有八九,统计数据或索引需要重建。 - Mitch Wheat
+1 给 Mitch - 我们之前遇到过这个问题,但是因为我们没有更新覆盖索引以包含新列。 - ta.speot.is
@taspeotis - 是的。这和碎片化似乎是可行的解释。不过我不知道对现有统计数据会产生什么影响。 - Martin Smith
3个回答

4
字段顺序在(字段始终相同的情况下)完全没有任何影响
磁盘结构基本上仍然保持不变。仅仅包括:
标题 固定长度列 空位图 可变长度列
以上操作只是在“固定长度”和“可变长度”部分内部重新排列了一些列。但是,无论它们排列成何种顺序,检索它们所需的处理都是相同的。
请参见Paul Randal的文章

但是我还没有得到我的答案。也许我们需要深入了解SQL Server的数据存储技术。 - Saleh
@Lightwing: 我说“没有任何区别”。你还需要什么呢…? - gbn
@LightWing:如果gbn的答案不能满足你,我不确定你需要什么样的答案。顺序并不重要,因为它是这样实现的。记录结构在gbn链接的文章中有解释。还有什么不清楚的吗? - Andrew Savinykh
1
感谢这篇文章,我找到了答案。谢谢。问题到此结束。 - Saleh
@LightWing:据我所知,按照创建顺序。因此,添加列的 ALTER TABLE 将附加在末尾。如果你现在的意思是“WHERE 子句的顺序是否重要”(基于上面的评论),我认为你可能需要另一个问题。这个问题现在太忙碌了,没法修改。 - gbn
在变长字段的末尾,NULL或空列根本不占用任何空间,因此如果titledescription更可能为NULL,则其中一个排序可能会更紧凑。 - Martin Smith

3
不会影响性能。

为什么?你能讨论一下为什么答案是否定的吗? - Saleh
2
由数据库来处理这种事情是最好的。在大多数情况下,你最好专注于调整查询和索引。当然,任何你所做的事情都会有一定的性能影响,但对于像这样的事情,它可能太小了,以至于无法测量,并且可能会在未来的服务包或其他任何东西中发生变化。微软并没有真正发布足够的信息来知道表字段顺序如何影响查询。 - squawknull
1
@squawknull:“微软并没有真正发布足够的信息来了解表字段顺序如何影响查询。” - 实际上它确实有。不同列排序唯一可能影响的是行存储(但这只是一个小差异):将可变长度列放在最后...(如果域允许,则尝试使所有列非空)。 - Mitch Wheat
在一个拥有超过40个字段且包含不同类型的大量和小量数据的表中,字段的顺序是否重要?或者where子句中条件的顺序是否重要? - Saleh
在理想的情况下,这不应该成为问题,查询优化器应该总是选择最佳的查询计划,无论列的顺序如何。然而,我的过去使用SQL Server的经验告诉我,一些小细节可能会产生影响,即使是我曾经合作过的最好的SQL Server DBA在处理这些棘手的问题时也常常被降级到试错阶段。最近的SQL Server版本并没有那么糟糕,但是通过许多小时的优化SQL Server查询,我意识到SQL Server查询优化器有时非常不可预测。 - squawknull
@LightWing - 你可以在这里了解一下关于数据存储的一些信息:http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx 我认为这可能会让人更加困惑而不是启发,但最重要的是,列顺序所造成的任何影响都将是微不足道的。 - Henry

-3

字段顺序对性能和维护操作频率有非常微妙的影响。从整体上看,更好地利用您的时间是:

  • 构建/测试索引
  • 重构查询
  • 分区表(水平和垂直)
  • 修改文件组架构

这不是详尽无遗的清单。

您没有提到是否已经调整了这些内容并仍然需要挤出一些额外的毫秒。


@gbn 只是因为你不喜欢某件事,并不意味着你必须对此感到不满。 - Phil Helmer
1
您在权威公共网站上发布了误导性信息,并没有回答问题。无论我喜欢还是不喜欢都是无关紧要的:但这个答案不应该出现在这里... - gbn
@gbn,我不同意我的答案是误导性的。 @squawknull 和 @Mitch Wheat(在Henry's回复中)的评论采取了相同的观点。难道因为我没有权威地陈述我的回答并引用与我的回答无关的文章而引起了您的愤怒吗?如果有什么问题,那就是误导性地说列顺序根本没有任何影响。顺便说一下,您可能需要查看FAQ,其中提到“友好”。我认为对OP进行尖刻攻击并不适合这种情况。我参加这个讨论是为了学习,而不是为了被那些不同意我观点的人攻击。 - Phil Helmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接