数据行的粒度

时间:2013-06-05 05:04:54

标签: sql sql-server

我们正在开发一个具有管理付款功能的应用程序。付款将写入表格中的一行,其中包含以下字段:

PersonId (INT)
TransactionDate (DATETIME)
Amount (MONEY)
PaymentTypeId (INT)
...
...
...

看起来我们处理了大约8000名我们发送付款的人,并且每人每天都会增加新的交易(每天大约8,000次插入)。这意味着在7年后(我们需要存储数据的时间),我们将有超过20,000,000行。

我们每年的人数增加了10%左右,所以这个数字有所增加。

最常见的查询是获得每人的SUM(金额),其中交易日期在开始日期和结束日期之间。

SELECT PersonId, SUM(Amount)
FROM Table
WHERE PaymentTypeId = x
AND TransactionDate BETWEEN StartDate AND EndDate
GROUP BY PersonId

我的问题是,这会成为SQL Server 2012的性能问题吗?或者是20,000,000行还不错?

我假设PersonID上有聚集索引? (要对它们进行分组),但这会导致非常慢的插入/更新?

TransactionDate上的索引?

1 个答案:

答案 0 :(得分:0)

如果您的查询选择基于TransactionDatePaymentTypeId,同时也需要PersonIdAmount,我建议在{{1}上添加非聚集索引}和TransactionDate并包括索引中的其他两列:

PaymentTypeId

这样,您的查询就可以从这个索引中得到满足 - 无需返回实际的完整数据页。

另外:如果您有多年可以“最终确定”(不再需要更改),您可以预先计算并存储某些摘要,例如:对于每一天,每个月等等。通过这种方法,某些查询可能只是从表中提取预先计算的总和,而不必再次计算数千行的总和。