SQL查询大约需要10到20分钟

时间:2010-06-18 13:05:44

标签: sql performance sqlperformance

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

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。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

是否在插入记录后索引了Access表。这应该使查询更快。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

尝试这样的事情:

SELECT * INTO NewTable FROM View

答案 4 :(得分:0)

我对Lotus Notes SQL并不太熟悉,但是由于很多很多原因,你在文本列中使用整数的事实听起来很糟糕。

  • 数据完整性:其中一个整数可能最终为“foo”。那你做什么?
  • 性能:通常,整数更小,更易于应用程序使用
  • 排序:对您将获得9,10,11,100的数字进行排序。将它们排序为文本,然后得到10,100,11,9

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

相关问题