SQL数据规范化/性能

SQL数据规范化/性能,sql,sql-server,sql-server-2005,performance,denormalization,Sql,Sql Server,Sql Server 2005,Performance,Denormalization,我正在为保险业开发一个web API,并试图为保险报价制定一个合适的数据结构 数据库已经包含一个“评级”表,基本上是: sysID (PK, INT IDENTITY) goods_type (VARCHAR(16)) suminsured_min (DECIMAL(9,2)) suminsured_max (DECIMAL(9,2)) percent_premium (DECIMAL(9,6)) [Unique Index on goods_type, suminsured_min and s

我正在为保险业开发一个web API,并试图为保险报价制定一个合适的数据结构

数据库已经包含一个“评级”表,基本上是:

sysID (PK, INT IDENTITY)
goods_type (VARCHAR(16))
suminsured_min (DECIMAL(9,2))
suminsured_max (DECIMAL(9,2))
percent_premium (DECIMAL(9,6))
[Unique Index on goods_type, suminsured_min and suminsured_max]
[编辑] 每种类型的货物通常有3-4个范围 [/编辑]

货物类型列表很少改变,大多数保险查询涉及价值低于100美元的货物。因此,我考虑使用以下格式的表格(从$0.00到$100.00的所有值)进行非标准化处理:

该数据的非规范化应易于维护,因为费率通常每月最多只更新一次。所有大于$100的值请求将始终在主表中查找并计算

我的问题是:
1.我最好将保险金额存储为十进制(9,2)还是以美分为单位存储在BIGINT中?

2.这种非标准化方法涉及在可能的20个表中存储10001个值($0.00到$100.00,增量为$0.01)。这可能比查找保费百分比并进行计算更有效吗?-还是我应该坚持使用主表并进行计算?

我不完全确定我们所讨论的计算是什么,但除非它们非常复杂,否则它们很可能比在几个不同的表中查找数据快得多。如果可能,在数据库中执行计算(即使用存储过程),以最小化应用程序层之间的数据流量


即使数据加载速度更快,我认为每月(甚至每季度)更新一次非标准化数据的想法也非常可怕。您可能可以很快完成这项工作,但是下一个处理系统的人呢?您是否要求他们学习数据库结构,记住每次需要更新的20多个表中的哪一个表,并正确地进行更新?我想说,如果数据被错误的信息污染,反规范化可能带来的性能提升将不会有多大价值。

我不完全确定我们所讨论的计算到底是什么,但除非它们非常复杂,它们很可能比在几个不同的表中查找数据快得多。如果可能,在数据库中执行计算(即使用存储过程),以最小化应用程序层之间的数据流量


即使数据加载速度更快,我认为每月(甚至每季度)更新一次非标准化数据的想法也非常可怕。您可能可以很快完成这项工作,但是下一个处理系统的人呢?您是否要求他们学习数据库结构,记住每次需要更新的20多个表中的哪一个表,并正确地进行更新?我想说,反规范化可能带来的性能提升对于使用错误信息污染数据的风险来说没有多大价值。

不要创建新表。您已经有了商品、最小值和最大值的索引,因此此sql for(已知商品及其值):

将有效地使用您的索引


您要查找的数据类型是smallmoney。使用它。

不要创建新表。您已经有了商品、最小值和最大值的索引,因此此sql for(已知商品及其值):

将有效地使用您的索引


您要查找的数据类型是smallmoney。使用它。

您建议的计划将对
10001
行使用
二进制搜索,而不是
3
4

这很难提高性能,不要这样做


至于算术,
BIGINT
会稍微快一点,我想你几乎不会注意到这一点。

你建议的计划将对
10001
行使用
二进制搜索,而不是
3
4

这很难提高性能,不要这样做


至于算术,
BIGINT
会稍微快一点,我想你几乎不会注意到这一点。

谢谢你的回答。你有没有想过用十进制(9,2)和美分来存储货币值作为BIGINT?事实上,我没有。我不太了解数据库的具体情况,不知道哪种方法最有效。不要相信我;)我最初的想法是整数在乘法时更快,但我不确定bigint对除法的反应如何-取决于你存储结果的方式,你可能会丢失数据。谢谢你的回答。你有没有想过用十进制(9,2)和美分来存储货币值作为BIGINT?事实上,我没有。我不太了解数据库的具体情况,不知道哪种方法最有效。不要相信我;)我最初的想法是整数在乘法时更快,但我不确定bigint对除法的反应如何-取决于存储结果的方式,可能会丢失数据。
Table Name: tblRates[goodstype]
suminsured (DECIMAL(9,2)) Primary Key
premium (DECIMAL(9,2))
SELECT percent_premium 
FROM ratings 
WHERE goods='PRECIOUST' and :PREC_VALUE BETWEEN suminsured_min AND suminsured_max