如何在Oracle数据库中更快地进行全表扫描?

时间:2015-12-12 00:45:40

标签: database oracle sqlperformance full-table-scan

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

SELECT * FROM Table1

有没有办法让我的数据库更快地返回结果?

背景:

我们有一个由第三方提供给我们的应用程序,它的设计非常强大/灵活 - 它的数据库中只有很少的大表。例如,其中一个表是“对象”表,它存储所有对象。另一个表是“关系”表,它捕获对象之间的所有关系。它基本上允许您存储任何内容而无需更改其架构。

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

我想知道如何处理性能问题。我在索引之后创建了索引,但查询仍然非常复杂,在一天结束时,我仍然需要进行多次全表扫描。

好消息是,我还处于设计阶段 - 所以我想听到尽可能多的建议,以防我错过了什么。

2 个答案:

答案 0 :(得分:3)

至少有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. 增加块大小在极少数情况下,较大的块大小可能会改善压缩,减少行链,并减少块开销。

答案 1 :(得分:2)

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

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

在空闲数据库上,您可以定义并行度,每个实例上的cpus / cores数量。