【问题标题】:How to make full table scans faster in Oracle database?如何在 Oracle 数据库中使全表扫描更快?
【发布时间】:2015-12-12 00:45:39
【问题描述】:

这是一个简单的问题。假设我有一个大表(500 万行),我别无选择,只能进行全表扫描。

SELECT * FROM Table1

有什么办法可以让我的数据库更快地返回结果?

背景:

我们有一个由第三方提供给我们的应用程序,该应用程序被设计为健壮/灵活 - 它的数据库中只有很少的大表。例如,其中一张表是“对象”表,它存储所有对象。另一个表是“关系”表,它捕获对象之间的所有关系。它本质上允许您在不更改其架构的情况下存储任何内容。

我的任务是设计一个单独的报告应用程序——一个查询这个数据库的应用程序。它必须是实时数据。而且由于表的大小,加上查询的复杂性,存在性能问题。

我想知道我应该如何处理性能问题。我已经在索引之后创建了索引,但查询仍然非常复杂,最终,我仍然需要进行多次全表扫描。

好消息是,我仍处于设计阶段 - 所以我希望听到尽可能多的建议,以防我遗漏了什么。

【问题讨论】:

  • PS:500万不算大
  • @EdHeal ...它肯定“大”到足以在全表扫描中出现性能问题......
  • RAID 0 一些 SSD 驱动器!
  • @NeilMcGuigan 嗯,想到了 SSD,但没有想到 RAID。谢谢。
  • 你对数据做了什么?如果您选择所有内容并将其返回给客户端,那么瓶颈很可能是网络和客户端应用程序而不是数据库。如果您在 Oracle 中处理数据以构建聚合或多维数据集,则可能会进行优化。否则,这个问题太宽泛了。例如,您可以购买 Exadata 机器。但对于一个相当不明确的问题,这是一个昂贵的解决方案。

标签: database oracle sqlperformance full-table-scan


【解决方案1】:

至少有 9 种方法可以改进全表扫描。但改进全表扫描不一定能提高整体性能,具体取决于对数据所做的具体操作。例如,如果将 500 万行发送到应用程序,网络将成为瓶颈,改进全表扫描也无济于事。

其中一些方法是极端的,可能只在极少数情况下有帮助,并且可能只会稍微提高性能。在应用深奥的调音想法之前,请仔细考虑。在您花费大量时间做一些只能将性能提高 1% 的事情之前,请确保全表扫描是瓶颈。

  1. 并行度 SELECT /*+ PARALLEL */ * FROM Table1; 并行度可以轻松地将许多系统上的全表扫描性能提高一个数量级。但是有很多限制 - 合理的配置、大表大小、仅限企业版等。
  2. DB_FILE_MULTIBLOCK_READ_COUNT 此参数控制一次读取多少个块。对于全表扫描,通常越多越好。这个参数很复杂,而且经常被误解。只要将其设置为默认值,它就可能是最佳的。
  3. 硬件 有很多方法可以提高磁盘性能。 SSD、不同的 RAID 选项、更快的磁盘、更多的磁盘等。
  4. 增加内存 通过增加内存量来缓存更多的表块,特别是缓冲区缓存,它是 SGA 的一部分。这可能意味着增加 MEMORY_TARGET 或 SGA_TARGET 的大小。
  5. 缩小表格 如果表格是只读的,请将其设置为 PCTFREE 0 以节省 10% 的正常空间,用于更改。此外,如果表格在过去发生了很大变化,ALTER TABLE MY_TABLE MOVE; 将重新组织它并可能填充一些空白空间。缩小表格的物理尺寸可能会加快阅读速度。
  6. 减少其他活动 检查数据库和服务器上的其他数据库是否有其他活动。可能有其他进程占用了部分资源。
  7. 压缩 使用不同类型的压缩可以显着缩小某些表。这是 I/O 和 CPU 之间的权衡。通常,解压缩数据所花费的时间少于检索更多块所花费的额外时间。
  8. 统一范围管理默认自动分配可能会浪费一点空间。使用小而统一的尺寸,可以节省少量空间。或者如果表有很多小分区,可能会占用大量空间。 CREATE TABLESPACE ... EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
  9. 增加块大小在极少数情况下,较大的块大小可能会改善压缩、减少行链接并使用更少的块开销。

【讨论】:

  • 答案很好。但我知道并行性适用于数据的接收端。 OP 只是在读表,所以硬件是瓶颈?还是我说的不对?
  • @EdHeal 如果没有来自 OP 的更多信息,很难知道。我回答了字面问题“如何在 Oracle 数据库中更快地进行全表扫描?”。但这完全有可能是XY problem。 只读取 500 万行会很奇怪;肯定有人或某事必须对数据做某事。此外,并行性适用于检索数据以及处理数据。我已经看到全表扫描从 100MB/s 到 1GB/s 并具有并行性。
  • @JonHeller 嗯,可能是 XY 问题。对不起,我是新来的。最初的任务是在现有数据库上创建实时数据报告应用程序。我已经更新了 OP。基本上,我已经尝试过创建索引,这很有帮助,但在某些时候我仍然需要进行全表扫描。而这些似乎是目前的瓶颈。
【解决方案2】:

您可以使用并行提示来使用并行线程更快地读取整个表。

SELECT /*+ parallel(t 4) */ * FROM Table1 t;

在空闲数据库上,您可以在每个实例上定义最多 cpu/核心数的并行度。

【讨论】:

  • 这是否取决于硬件存储数据的速度。这会成为瓶颈吗?
  • 它需要多个 CPU/核心。此外,数据应该位于集群文件系统上,以便通过多个网络 i/o 通道获得更好的性能。
  • 我建议并行位无关紧要 - CPU 功率不是限制因素。限制因素将是从硬盘中检索数据。如果您实际上正在对数据进行一些处理,则并行提示会起作用。
  • @EdHeal Parallelism 可以显着提高 Oracle 中的 I/O 吞吐量。如果还有像网络这样的瓶颈,它仍然可能无济于事。但是在 Oracle 数据仓库中使用并行性来提高全表扫描性能是很常见的。
  • @JonHeller - OP 的声明只是为了阅读表格。如果你正在对数据做一些建设性的事情,我同意你,那么并行是要走的路。但我们面前的查询只是读取数据——因此瓶颈将是从磁盘传输数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2013-10-01
相关资源
最近更新 更多