选择SQL Server数据类型以获得最大速度

时间:2012-04-22 10:09:03

标签: sql-server database-design types sql-server-2008-r2

我正在设计一个需要针对最大速度进行优化的数据库。

所有数据库数据都是从我称之为输入数据库的东西中生成的(其中包含我正在编辑的数据,主要是谷歌地图的一些折线,标记等)。

因此数据库不受编辑,但需要保存尽可能多的数据,以便快速向用户显示结果(遍布城镇的路线,自定义折线等)。

问题是:选择较小的数据类型,例如像smallint over int会改善性能还是会影响它?空间不是一个问题,经过一些快速计算后,数据库不会超过200mb,并且不会有超过100.000行的表(平均值约为5.000)。

我问这是因为我在互联网上阅读了一些文章,有些人说较小的数据类型提高了性能,其他人说这会影响它,因为必须进行额外的处理。我知道对于较小的数据库可能结果不明显,但我对每一点都感兴趣,因为我期待很多请求会触发更多的查询。

托管环境将是带有SQL Server 2008 R2的Windows Server 2008 R2。

编辑1:仅举几个例子,因为我还没有合适的表结构: 我将有一张桌子,可以容纳公共交通线路(大约200个左右),由现实生活中的一个唯一编号标识,并且将在各种各样的表格中被引用,并且各种各样的操作正在进行中被制造。这些引用表将保存最大量的数据。

因为线条有唯一的数字,所以我想到了3个设计实例:

  1. PK是数据类型的行号:smallint

  2. PK是数据类型的行号:int

  3. PK是不同的(例如身份),行号存储在不同的字段中。

  4. 仅仅是为了论证,因为我在'输入数据库'上使用了这个,不受优化,PK是一个GUID(16字节);如果你愿意的话,你可以比较一下与其他人相比有多糟糕,如果它真的是

  5. 所以请记住,PK将在至少15个表中引用,其中一些表将有超过50.000行(其余的平均值为5.000,如上所述),这些表将受到不断的查询和操作,我对能得到的每一点速度感兴趣。

    如果您需要,我可以更详细地说明这一点。感谢

    编辑2:我想到了另一个与此相关的问题,认为它适合这个讨论:

    如果我在.NET应用程序中使用本机SQL查询而不是使用LINQ to SQL,我是否会在此特定方案中看到任何性能改进?我知道LINQ经过了强有力的优化,可以在性能方面产生非常好的查询,但仍然值得一提。再次感谢。

3 个答案:

答案 0 :(得分:4)

您是否可以指出一些文章说较小的数据类型=更多的处理?请记住,即使使用SSD,今天的大多数工作负载都受I / O限制(或受内存限制)而不受CPU限制。

特别是在许多表中将引用PK的情况下,使用可能的最小数据类型将是有益的。在这种情况下,如果那是SMALLINT那么我会使用(虽然你说有大约200个值,所以理论上你可以使用TINYINT,它是一半大小并支持0-255)。如果您不能100%确定总会有~200个值,那么您需要谨慎行事。一旦你需要256,你将不得不在所有受影响的表中更改数据类型,这将是一个痛苦。因此,有时需要在适应未来增长和挤压当今最绝对的业绩之间进行权衡。如果您不确定您将永远不会超过255或32,000个值,那么我可能只需INT。除非你也不知道你的价值不会超过20亿,否则你会使用BIGINT

INT / SMALLINT / TINYINT之间的差异在磁盘空间中比在性能上更明显。 (如果您使用Enterprise,则使用数据压缩可以抵消磁盘空间和性能方面的差异 - 特别是当您的INT值全部符合SMALLINT / TINYINT时虽然在后一种情况下,它实际上可以忽略不计,因为这些值是唯一的。)另一方面,任何这些和GUID之间的差异在性能和磁盘空间中都会更加明显。马克给了金伯利一些很棒的联系; I wrote this article在2003年,虽然它有点过时,但确实包含了今天仍然相关的大部分要点。

有时需要考虑的另一个权衡(尽管不是在您的具体情况下,似乎)是值是否需要在多个系统中是唯一的。这是您可能需要牺牲一些性能以满足业务需求的地方。在很多情况下,人们采取简单的方式,并将自己辞职GUID。但是还有其他解决方案,例如标识范围,中央自定义序列生成器以及SQL Server 2012中的新SEQUENCE对象。I wrote about SEQUENCE早在2010年,SQL Server 2012的第一个公开测试版就是释放。

答案 1 :(得分:0)

我认为您需要提供有关表格结构和将针对它们运行的​​示例查询的更多详细信息。根据您提供的信息,我认为选择较小数据类型的影响只有几个百分点,我建议您更加关注您将拥有的索引。通过为您的查询提供执行计划并调整顾问工具,SQL Server可以很好地建议要创建的索引

答案 2 :(得分:-2)

我的一个建议是合并十进制数据类型而不是使用字段组合。例如,我建议不要使用日期(YYYYMMDD),商店(SSSS)和项目(IIII)的表格,而是建议... YYYYMMDD.SSSSIIII。特别是在使用相同的组合键查询多个表时,它可以显着缩短处理时间。