4

我正在设计一个需要优化以获得最大速度的数据库。

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

所以数据库不需要编辑,但它需要尽可能多地保存数据,以便快速向用户显示结果(穿过城镇的路线、自定义折线等)。

问题是:选择较小的数据类型,例如 smallint 而不是 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 字节);如果你愿意,你可以比较一下这与其他人相比有多糟糕,如果真的是

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

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

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

如果我从我的 .NET 应用程序内部使用本机 SQL 查询而不是使用 LINQ to SQL,我会在这个特定场景中看到任何性能改进吗?我知道 LINQ 进行了高度优化,并且在性能方面产生了非常好的查询,但仍然值得一问。再次感谢。

4

3 回答 3

4

你能指出一些文章说更小的数据类型 = 更多的处理吗?请记住,即使使用 SSD,今天的大多数工作负载也是 I/O 绑定(或内存绑定)而不是 CPU 绑定。

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

INT//之间的差异在磁盘空间上比在性能上更明显SMALLINTTINYINT(如果您使用的是 Enterprise,磁盘空间和性能的差异可以使用数据压缩来抵消很多 - 特别是当您的INT值都适合SMALLINT/TINYINT时,尽管在后一种情况下它确实可以忽略不计,因为值是独特的。)另一方面,这些之间的差异GUID将在性能和磁盘空间方面更加明显。Marc 提供了一些来自 Kimberly 的很棒的链接;我在 2003 年写了这篇文章,虽然它有点过时,但它确实包含了今天仍然相关的大部分要点。

有时需要考虑的另一个权衡(尽管似乎不是在您的特定情况下)是值是否需要在多个系统中是唯一的。这是您可能需要牺牲一些性能以满足业务需求的地方。在很多情况下,人们会采取简单的方法并接受GUID. 但也有其他解决方案,例如身份范围、中央自定义序列生成器和 SQL Server 2012 中的新SEQUENCE对象。我在 2010 年 SQL Server 2012 的第一个公共测试版发布时写过。SEQUENCE

于 2012-04-22T13:52:07.770 回答
0

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

于 2012-04-22T10:15:42.023 回答
-2

我的一个建议是合并十进制数据类型,而不是使用字段组合。例如,我建议不要使用包含 Date (YYYYMMDD)、Store (SSSS) 和 Item (IIII) 的表,而是...YYYYMMDD.SSSSIIII。尤其是在使用相同的组合键查询多个表时,它极大地缩短了处理时间。

于 2012-06-07T19:19:24.733 回答