0

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

SELECT * FROM Table1

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

背景:

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

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

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

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

4

2 回答 2

4

至少有 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. 增加块大小在极少数情况下,较大的块大小可能会改善压缩、减少行链接并使用更少的块开销。
于 2015-12-12T20:17:14.260 回答
2

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

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

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

于 2015-12-12T01:25:46.443 回答