我正在设计一个需要针对最大速度进行优化的数据库。
所有数据库数据都是从我称之为输入数据库的东西中生成的(其中包含我正在编辑的数据,主要是谷歌地图的一些折线,标记等)。
因此数据库不受编辑,但需要保存尽可能多的数据,以便快速向用户显示结果(遍布城镇的路线,自定义折线等)。
问题是:选择较小的数据类型,例如像smallint over int会改善性能还是会影响它?空间不是一个问题,经过一些快速计算后,数据库不会超过200mb,并且不会有超过100.000行的表(平均值约为5.000)。
我问这是因为我在互联网上阅读了一些文章,有些人说较小的数据类型提高了性能,其他人说这会影响它,因为必须进行额外的处理。我知道对于较小的数据库可能结果不明显,但我对每一点都感兴趣,因为我期待很多请求会触发更多的查询。
托管环境将是带有SQL Server 2008 R2的Windows Server 2008 R2。
编辑1:仅举几个例子,因为我还没有合适的表结构: 我将有一张桌子,可以容纳公共交通线路(大约200个左右),由现实生活中的一个唯一编号标识,并且将在各种各样的表格中被引用,并且各种各样的操作正在进行中被制造。这些引用表将保存最大量的数据。
因为线条有唯一的数字,所以我想到了3个设计实例:
PK是数据类型的行号:smallint
PK是数据类型的行号:int
PK是不同的(例如身份),行号存储在不同的字段中。
仅仅是为了论证,因为我在'输入数据库'上使用了这个,不受优化,PK是一个GUID(16字节);如果你愿意的话,你可以比较一下与其他人相比有多糟糕,如果它真的是
所以请记住,PK将在至少15个表中引用,其中一些表将有超过50.000行(其余的平均值为5.000,如上所述),这些表将受到不断的查询和操作,我对能得到的每一点速度感兴趣。
如果您需要,我可以更详细地说明这一点。感谢
编辑2:我想到了另一个与此相关的问题,认为它适合这个讨论:
如果我在.NET应用程序中使用本机SQL查询而不是使用LINQ to SQL,我是否会在此特定方案中看到任何性能改进?我知道LINQ经过了强有力的优化,可以在性能方面产生非常好的查询,但仍然值得一提。再次感谢。
答案 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。特别是在使用相同的组合键查询多个表时,它可以显着缩短处理时间。