【问题标题】:Reducing time for query减少查询时间
【发布时间】:2016-12-28 11:32:46
【问题描述】:

我正在尝试运行以下查询,但由于数据量很大,所以需要很长时间:

SELECT pre.Count AS Precount, consol.Count AS commoncount, post.Count AS Postcount, Precount-commoncount AS deleted, postcount-commoncount AS added
FROM (SELECT COUNT([PRE_L]) AS [count] FROM PRE_LNADJL_2)  AS pre,
     (SELECT COUNT([PRE_L]) AS [count] FROM CD_LNADJL)  AS consol,
     (SELECT COUNT([Post_L]) AS [count] FROM POST_LNADJL_2)  AS post;

【问题讨论】:

  • 1.请不要在整个帖子中使用大写字符,这被认为是大喊大叫,因此很粗鲁。 2. 请为您的问题使用适当的标签。它与 MySQL 没有任何关系,因为它使用不同的方式来指示别名。访问标签是为了安全。 3. 由于你是统计 3 个表中的所有记录,所以优化空间很小。
  • 您到底要数什么?所有记录?然后使用COUNT(*),如果表有主键会快很多。还可以尝试分别运行 3 个子查询,看看这有多快。

标签: ms-access


【解决方案1】:

当我在一家审计公司工作时,我们曾经做过一个小技巧,我们的后端是 SQL Server,我们正在处理一些超过 5B 条记录的表。我们要做的是“预运行”我们的报告。也就是说,我们会在一夜之间过滤我们的数据并将其写入新表。这样一来,在没有人需要数据的情况下,就可以完成所有更大规模、更耗时的计算。

我建议您将 On Timer 事件设置为在没有人在办公室时运行。在这种情况下,运行类似:

INSERT INTO pre SELECT COUNT([PRE_L]) AS [count] FROM PRE_LNADJL_2
INSERT INTO consol SELECT COUNT([PRE_L]) AS [count] FROM CD_LNADJL
INSERT INTO post SELECT COUNT([Post_L]) AS [count] FROM POST_LNADJL_2

(您也可以执行 SELECT INTO,取决于您是否希望每次运行时都必须删除/重新创建或清除数据持有者表)

然后,每当您的用户需要运行此报告或其他任何内容时,SQL 只需:

SELECT pre.Count AS Precount, consol.Count AS commoncount, post.Count AS Postcount, 
       Precount-commoncount AS deleted, postcount-commoncount AS added
FROM (SELECT * FROM pre),
 (SELECT * FROM consol),
 (SELECT * FROM post);

应该在 2 秒内运行。

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多