我可以应用哪些优化来加快此查询的速度?

Posted

技术标签:

【中文标题】我可以应用哪些优化来加快此查询的速度?【英文标题】:What optimizations could I apply to speed up this query? 【发布时间】:2012-08-31 14:49:45 【问题描述】:

我正在为我工​​作的公司创建一个简单的业务分析应用程序,并拥有一个 100mb 的 csv 文件,其中包含过去 6 年的销售交易,我已将其解析到多个数据库中。

我想在我的应用程序中显示的数据之一是每位客户每天的营业额和利润,所以我有一个如下所示的 while 循环:

while(start_date < current_date)
    
        SELECT SUM(profit), SUM(turnover) FROM sales WHERE date = @date
    

因此,我在一个有几十万行的表上运行该查询的次数与 6 年来每天的客户次数一样多。

我总是被引导相信可以在数据库中执行的任何工作都应该是 - 这就是我使用 SUM 查询来汇总列的原因。

我还可以进行哪些其他优化?目前它正在占用......好吧,我无法告诉你,因为它在一个 8GB 四核服务器上运行了最后一个小时,看起来它在 2-3% 左右。

我使用的是 SQL Server Compact Edition,它是 C#/.NET 中的一个 winforms 应用程序,但 db 显然是这里的瓶颈。

【问题讨论】:

【参考方案1】:

我只会运行这个(修改过的)查询一次并遍历结果集。它应该更快。

SELECT 
    customer, date, SUM(profit), SUM(turnover) 
FROM 
    sales 
WHERE 
    date < current_date 
GROUP BY 
    customer, date
ORDER BY
    customer, date

for each (row in resultset) 
    //process customer/date

【讨论】:

【参考方案2】:

尝试引入汇总表,您将在其中获得每日统计信息。每当您向销售表添加更多数据时,更新该汇总表 [使用触发器或应用程序逻辑]。

【讨论】:

这就是我打算为更新做的事情。我可能应该在我最初的问题中解释这一点 - 实际问题是关于我如何优化和加速初始查询,因为它需要花费很多年。 :) 日期列有索引吗?

以上是关于我可以应用哪些优化来加快此查询的速度?的主要内容,如果未能解决你的问题,请参考以下文章

假如mysql数据库单表有100W行记录,有哪些方式加快查询速度

我可以做些啥来加快这个 SQL 查询的速度?

添加 Limit 可以加快 mysql 查询速度,为啥?

如何提高oracle的查询速度

如何在 Firebird 2.1 中优化此查询?

为啥删除 ORDER BY 会显着加快此查询的速度?