![](/img/trans.png)
[英]Oracle starts to do full table scans when a column is changed from varchar to nclob
[英]How to make full table scans faster in Oracle database?
这是一个简单的问题。 假设我有一个庞大的表(500万行),并且别无选择,只能进行全表扫描。
SELECT * FROM Table1
有什么办法可以使我的数据库更快地返回结果?
背景:
我们有一个第三方提供给我们的应用程序,该应用程序被设计为健壮/灵活的-数据库中只有很少的大型表。 例如,表之一是“对象”表,该表存储所有对象。 另一个表是“关系”表,该表捕获对象之间的所有关系。 从本质上讲,它允许您存储任何内容而无需更改其架构。
我的任务是设计一个单独的报告应用程序-一个查询该数据库的应用程序。 它必须是实时数据。 而且由于表的大小以及查询的复杂性,因此存在性能问题。
我想知道应该如何处理性能问题。 我已经在索引之后创建了索引,但是查询仍然非常复杂,最终,我仍然必须进行多次全表扫描。
好消息是,我仍处于设计阶段-因此,我想听到尽可能多的建议,以防万一我错过了一些东西。
至少有9种方法可以改善全表扫描。 但是,改进全表扫描可能不一定会改善整体性能,具体取决于对数据执行的操作。 例如,如果将500万行发送到应用程序,则网络将成为瓶颈,而改进全表扫描将无济于事。
这些方法中的一些是极端的,可能仅在极少数情况下有用,并且可能只会稍微改善性能。 在应用深奥的调整想法之前,请仔细考虑。 在花费大量时间执行可能只会将性能提高1%的操作之前,请确保全表扫描是瓶颈。
SELECT /*+ PARALLEL */ * FROM Table1;
并行可以在许多系统上轻松地将全表扫描性能提高一个数量级。 但是有很多限制-合理的配置,较大的表大小,仅企业版等。 PCTFREE 0
以节省正常的10%的更改空间。 另外,如果表在过去发生了很大变化,则ALTER TABLE MY_TABLE MOVE;
将对其进行重新组织,并可能填充一些空白空间。 缩小表的物理大小可能会使其读取起来更快。 CREATE TABLESPACE ... EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
您可以使用并行提示来使用并行线程来更快地读取完整表。
SELECT /*+ parallel(t 4) */ * FROM Table1 t;
在空闲数据库上,您可以在每个实例上最多定义cpus /核心数的并行度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.