【问题标题】:SQL Query takes about 10 - 20 minutesSQL 查询大约需要 10 - 20 分钟
【发布时间】:2010-06-18 13:05:43
【问题描述】:

我有一个选择(没什么复杂的)

Select * from VIEW

这个视图有大约 6000 条记录和大约 40 列。它来自 Lotus Notes SQL 数据库。所以我的 ODBC 驱动是 LotusNotesSQL 驱动。该查询大约需要 30 秒才能执行。我工作的公司使用 EXCEL 运行查询并将所有内容写入工作表。由于我假设它会逐个单元格地写入所有内容,因此过去最多需要 30 到 40 分钟才能完成。

然后我使用 MS 访问。我在 Access 上创建了一个副本本地表来存储数据。我的第一次尝试是

INSERT INTO COLUMNS OF LOCAL TABLE
FROM (SELECT * FROM VIEW)

请注意,这是伪代码。这运行成功,但又花费了 20 到 30 分钟。然后我使用 VBA 循环遍历数据并为每个单独的记录手动插入(使用 INSERT 语句)。这大约需要 10 到 15 分钟。这是我迄今为止最好的情况。

之后我需要做什么: 获得数据后,我需要按部门过滤。问题是如果我在 SQL 查询中放置一个 where 子句(执行查询的时间从 30 秒跳到大约 10 分钟 + 写入本地表/excel 的时间)。我不知道为什么。 可能是因为这些列都是文本列?

如果我们将某些列更改为整数,在 where 子句方面会使其更快吗?

我正在寻找有关如何解决此问题的建议。我的老板说我们可以采用一些基于 Java 的解决方案。这会有帮助吗?我不是 java 人,而是 c#,也许我会说服他们也使用 c#,但我主要是在寻找有关如何减少时间的建议。我已经将它从 40 分钟缩短到 10 分钟,但希望它在 2 分钟以内。

简单回顾一下:

查询大约需要 30 秒才能执行

在 Excel/Access 中本地使用查询大约需要 15 - 40 分钟

需要在 2 分钟内完成

可以使用基于 java 的解决方案

您可以建议其他解决方案而不是 java。

【问题讨论】:

  • 仅供参考 切勿选择 * 这对性能不利,您应该只选择您需要的列。
  • 嗯,整个语句是选择..所有列..他们想要这些数据,我该怎么办?我只是一个棋子。 :P
  • 什么时候需要30秒,什么时候需要15分钟?我很困惑。
  • 运行查询需要 30 秒。我在临时本地表中获取数据(使用访问或 ms 查询编辑器)。然后我需要将所有数据写入磁盘。在 excel 中(在逐个单元格的情况下减慢速度)或在访问本地表中。
  • @masfenix - 列出列而不是 SELECT *。我认为这是 David 的观点,尽管 IMO 不是出于性能原因,而是简单的编程 - 如果基础表发生更改,SELECT * 将破坏大多数应用程序。

标签: sql performance sqlperformance


【解决方案1】:

您是否尝试过使用批量查询?本周早些时候我在使用 C# 时遇到了同样的问题;我必须插入大约 25000 条记录,大约需要 30 分钟。更改为批量插入将其缩短到大约 5 秒。

【讨论】:

  • 我不确定lotus notes sql驱动是否支持这个,但我一定会试一试
  • 是的,当然。我是实习生,所以我的理解有点有限,但是我相信一个一个插入语句会为每个语句生成一个日志文件,而进行批量查询只需创建一个日志文件,这样可以减少时间。不过我可能是错的。
  • 哦,好吧!我也是实习生!
【解决方案2】:

您是否在插入记录后为您的 Access 表建立了索引。这应该会使查询速度更快。

【讨论】:

  • 记录插入后,它的光照快速过滤它们。问题是从远程服务器获取数据到本地访问服务器
  • 我不确定这是否是 HLGEM 想要表达的意思,但请确保在导入之前从 Access 表中删除所有索引,然后再重新创建它们。否则,Access 将不得不更新索引和表,这会花费大量时间。
【解决方案3】:

如果不支持使用批量插入或太麻烦,一个简单的解决方案可能是使用事务: 因为大多数数据库都应该是原子安全的,所以每次插入都带有一定的最小开销(这是一个巨大的简化,但无论如何)。通过将所有插入包装到单个事务中,您可以避免原子提交开销。

但是,要真正提高性能,您需要进行更多基准测试。特别是,是inserts 慢,还是select ... from view

【讨论】:

  • 慢的是插入语句。能否请您详细说明如何在 Access 中使用事务?
  • 参见例如msdn.microsoft.com/en-us/library/bb208950%28office.12%29.aspx 了解交易详情。但是,您可能会使用一些包装器技术——您可能可以在那里管理事务,而不是在原始 SQL 中管理事务——但如何做到这一点取决于您使用的数据访问客户端。 (如果您想了解更多关于事务以及如何使用它们的信息,那么提出一个新问题可能是合适的。)
  • 好吧,那么请看上一条评论中的链接。如果您使用的是不同的客户端 - 请在该客户端的文档中查找。
【解决方案4】:

试试这样的:

SELECT * INTO NewTable FROM View

【讨论】:

    【解决方案5】:

    我对 Lotus Notes SQL 不太熟悉,但由于许多原因,在文本列中包含整数这一事实听起来是个非常糟糕的主意。

    • 数据完整性:这些整数之一可能以“foo”结尾。那你怎么办?
    • 性能:通常,整数更小,更易于在应用程序中使用
    • 排序:对数字进行排序,您将得到 9、10、11、100。将这些数字排序为文本,您将得到 10、100、11、9

    现在谈谈您的问题...我认为 Lotus Notes SQL 在幕后使用了 NotesSQL 数据库。我认为您可以自己在其中创建索引。您是否尝试过在 WHERE 子句中的列上创建索引?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2016-01-05
      • 1970-01-01
      • 2014-01-26
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多