【问题标题】:Reading a table from Oracle is 10 times slower than reading from Sql-Server从 Oracle 读取表比从 Sql-Server 读取慢 10 倍
【发布时间】:2020-09-04 08:44:02
【问题描述】:

我有一个只有 5 列和 8500 行的表。以下对 Oracle 数据库的简单查询大约需要 8 秒,而如果我将同一个表导入 Sql-Server 数据库,则只需不到 1 秒。

SELECT CustomerList.* FROM CustomerList ORDER BY TypeID, OrderNr, Title

问题:我对数据库完全陌生,并且已经开始获取有关它的知识,但是 8 秒对于 8500 条记录来说太长了。有什么办法可以解决这个问题吗?

更新:我从 Oracle 数据库中将表导出为文本文件,然后将测试文件导入另一个新的 Oracle 数据库以创建相同的表。当我对这个新创建的数据库执行上述查询时,查询的执行时间再次与以前相同(即大约 8 秒)。

【问题讨论】:

  • 数据库性能是broad subject,具有许多方面(硬件、查询优化、索引、统计信息,...)。查询计划通常是一个很好的起点。你能share(sql-server)两个执行的查询计划吗?我不熟悉必须如何生成或解释 Oracle query plan
  • 在我看来,无论你用 8500 行做什么都应该非常快,即使在你 PC 上的 Excel 中,更不用说数据库服务器上的 Oracle 数据库(甚至如果是你的电脑)。 8500 行几乎没有。几次后续选择需要 8 秒,还是只发生一次?数据库在哪里? CPU是做什么的?网络?您使用哪种工具?如果删除 ORDER BY 子句会发生什么?
  • 您的 HWM 是否设置为您的 CustomerList 表的高值?执行 CTAS 并重试(Oracle 数据库)
  • 检查 here 在 Oracle 中遇到性能问题时您应该调查/发布的内容。检查CUSTOMERLIST 是否不是select OBJECT_TYPE from user_objects where object_name = 'CUSTOMERLIST' 的(复杂的)view*。学习 google 例如Oracle CTAS
  • 如何查询数据库?使用 sqlplus?在屏幕上显示整个 8500 行?

标签: sql-server oracle


【解决方案1】:

关于高水位线 (HWM)。在 oracle 中,表行的空间以称为“范围”的大块分配。当一个区被数据行填满时,就会分配一个新的区。 HWM 是指向最高分配地址的指针。

如果行被删除,占用的空间仍分配给该表并可用于新行,而不必为它们获取更多空间。 HWM 仍然存在。即使您删除了所有行(简单的 DELETE FROM MYTABLE),所有空间仍分配给表并可用于新行,而无需获取更多空间。 HWM 仍然存在。假设您有一个包含 10 亿行的表。然后删除除其中一行之外的所有行。你还有 10 亿的空间,HwM 也相应地设置了。现在,如果您在没有 WHERE 条件的情况下从该表中选择将使用索引(从而强制进行全表扫描或 FTS),oracle 仍然必须扫描十亿行空间以查找所有行,这些行可能分散在整个空间。但是,当您将这些行插入另一个数据库(甚至同一数据库中的另一个表)时,您只需要为这些行提供足够的空间。因此,根据新表进行选择会相应地更快。

这是您的问题的一种可能性。

【讨论】:

  • 感谢您的信息。我还将表导出到一个文本文件中,然后将该文本导入到一个新的 Oracle 数据库中。在这种情况下,所花费的时间也是相同的。
  • “相同”是什么?快还是慢?当然,正如我所说,HWM 问题只是您的问题的一种可能性。
  • “相同” ---> 慢(即大约 8 秒)
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多