Rob*_*man 11 sql-server partitioning
我从来没有使用过 SQL Server 分区,但我目前面临着设计一个卷可能需要它的数据库。该系统用于优惠券。优惠券将定期发行,通常每六周发行一次,但也会有临时发行——例如特殊活动。有1500万客户,每一次发行活动,每个客户将获得6种不同的优惠券类型,共计9000万张优惠券实例。我们需要跟踪优惠券实例兑换数据并将其保持 6 个月,尽管通常优惠券的有效期仅为 6 周。任何对无效优惠券的兑换请求都不会到达数据库,因为它将由 POS 直到验证。
在六个月的时间里,我们需要在 Coupon Instance 表中存储 3.6 亿行,在 Redemption 表中存储多达 7200 万行(假设最高 20% 的赎回率)。我觉得这些数字对于单个分区来说太大了?
我的问题是 - 使用什么作为分区键?一个明显的候选者是发行事件,给出大约 6 个分区。但是我认为即使这样也会导致分区大小太大而无法实现最佳性能?是否可以通过两个键进行分区,例如通过发行事件 + 客户 ID 的最后一位数字?所以逻辑是:
If issuance event = 1 and last digit of customer id < 5 then
Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
Store in partition 4
Etc...
Run Code Online (Sandbox Code Playgroud)
另外,我不确定我们需要的数据库服务器的规格。16GB 和 8CPU 够不够?数据库需要能够从优惠券实例表中返回一个结果,在不到半秒的时间内键入一个数字条形码值。验证(选择)和兑换(插入)的预期交易请求预计将达到每分钟约 3,500 次的峰值。
SQL Server 2008r2 64 位数据库服务器将被配置为来自非常强大的主机的 VM,该主机可以访问高性能和大容量的 SAN。
我非常感谢那些部署了 SQL Server 解决方案来管理类似卷的人的任何建议。
问候
抢。
JNK*_*JNK 14
服务器规范问题应针对 Serverfault 或 DBA.SE。
对于分区问题,我认为您不一定需要为此进行分区。
360m 行很多,但并不太笨重。
请不要在任何情况下尝试分区基于字段的最后一位。我不确定这是否会奏效,但它不是 SARGable 是站不住脚的。
如果您只需要基于数字键进行单行查找,分区可能无济于事。
如果您确实决定采用分区路线,请记住要使所有查询都有效,包括您的分区键,以便引擎知道要检查哪个分区。否则它会检查所有这些,你实际上会损害性能。
小智 5
如果您使用持久计算列,您可以对多个键进行分区;然而,正如其他人所说,分区并不适用于所有情况。我不确定我是否足够了解您的情况,无法为您提供具体建议,但这里有一些一般准则:
当分区键是 SQL 语句的一部分时,分区在读取数据时很有用,这允许优化器调用分区排除。您需要确保您选择的键对大多数查询都有用。
一个好的分区策略的好处之一是老化数据;例如,如果您的分区键是基于日期的(即一年中的某一天),并且您想删除所有早于某个日期的数据,则可以很容易地将这些分区切换到一个空表并进行截断。