繁体   English   中英

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

[英]How to make full table scans faster in Oracle database?

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

SELECT * FROM Table1

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

背景:

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

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

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

好消息是,我仍处于设计阶段-因此,我想听到尽可能多的建议,以防万一我错过了一些东西。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM