我使用下面的查询从sqldb中的表中检索记录。此报表聚合条目列表的值之和。最终的结果是一份报告列出了大约7百万条记录中的2500个客户。
select customer_id, sum(value) as value
from `data`
where ((`date` >= '2020-05-11' and `date` <= '2020-06-9'))
group by `customer_id`
order by `value` desc, `customer_id` asc;
如果我选择全年作为日期范围,则生成此报告大约需要60秒。此报表还有一个可自定义的功能,允许用户在报表中最多添加3个特定列。因此,除了简单的列表之外,用户还可以选择查看销售来自哪些媒体、产品类别和产品部门。
我想加快报表生成所需的处理时间,并考虑创建一个额外的表,该表将仅包含每个客户机当前聚合值的分组条目以及上一段中提到的3个字段的信息。这基本上意味着我的数据库将从大约7 mil记录缩减到大约2.5 mil记录。此外,表中已经计算了总和,这样也可以节省时间。
(我想)你觉得这张多出来的table会有什么不同吗?还有其他建议吗?
在一些评论之后添加。至少可以说是有趣的评论。为了使事情更具挑战性,让我补充一些细节。我在两个不同的服务器上运行相同的db内容。原始数据库只包含一个主表,其中包含7 mil条记录,根本没有索引。所以所有的搜索都是基于文本的。不过,大多数查询的运行速度还是可以接受的。第二个db从原始db中的主表馈送数据。这个数据库被分割成更小的表,有适当的索引,并且这个数据库上的查询要比原始数据库中的查询花费更长的时间(当然是同样的问题)。不过,我的主要问题是。如果我创建一个新的表,只列出客户的合计金额,以及我在第一段中提到的3个字段的信息,那会有所不同吗。让我用一个实际的例子来说明这一点。一个客户购买15种不同的产品,属于两个不同的产品类别。我的sales表将向此事务的原始sales表中添加15条记录。我的新销售表将只列出按类别购买的总和,因此它将只添加2个记录。在一个大的规模上,这意味着我将能够缩小一个7百万记录(并不断增长)到一个2百万记录表。所以我的问题是。你认为这会加快我的查询速度吗?
2条答案
按热度按时间fcg9iug31#
至少要确保[日期]上有索引。
确保比较的是相同的数据类型-否则很可能不会使用索引。在原始代码中,您将[date]列与字符串进行比较。
如果[date]是一个日期,那么您应该执行以下操作:
([date] >= convert( date, '2020-05-11') and [date] <= convert(date,'2020-06-9'))
如果[date]是一个字符串,那么应该使用'2020-06-09'
不是'2020-06-9'
因为原版会在六月的所有日子里都回来。还要确保它始终是yyyy-mm-dd,而不是任何其他格式。hzbexzde2#
您可以使用覆盖索引加快查询速度:
这个索引将提高查询的性能,假设它返回的行数有限;结果集不超过行的0.5%。但是,您的查询似乎处理了整整一个月的数据。不管你怎么做,那一定很慢。