这是一个简单的问题。假设我有一个庞大的表(500万行),我别无选择,只能进行全表扫描。
SELECT * FROM Table1
有没有办法让我的数据库更快地返回结果?
背景:
我们有一个由第三方提供给我们的应用程序,它的设计非常强大/灵活 - 它的数据库中只有很少的大表。例如,其中一个表是“对象”表,它存储所有对象。另一个表是“关系”表,它捕获对象之间的所有关系。它基本上允许您存储任何内容而无需更改其架构。
我的任务是设计一个单独的报告应用程序 - 一个查询该数据库的应用程序。它必须是实时数据。而且由于表的大小,加上查询的复杂性,存在性能问题。
我想知道如何处理性能问题。我在索引之后创建了索引,但查询仍然非常复杂,在一天结束时,我仍然需要进行多次全表扫描。
好消息是,我还处于设计阶段 - 所以我想听到尽可能多的建议,以防我错过了什么。
答案 0 :(得分:3)
至少有9种方法可以改善全表扫描。但改进全表扫描可能不一定会改善整体性能,具体取决于对数据的确切操作。例如,如果将500万行发送到应用程序,则网络将成为瓶颈,并且改进全表扫描不会有帮助。
这些方法中的一些是极端的,可能仅在极少数情况下有所帮助,并且可能仅略微提高性能。在应用深奥的调整思路之前要仔细考虑。在花费大量时间做一些可能只能将性能提高1%的事情之前,请确保全表扫描是瓶颈。
SELECT /*+ PARALLEL */ * FROM Table1;
在许多系统上,并行性可以轻松地将全表扫描性能提高一个数量级。但是存在许多限制 - 理智的配置,大型表大小,仅限企业版等。PCTFREE 0
以保存为更改保存的正常10%的空间。此外,如果表格在过去发生了很大变化,ALTER TABLE MY_TABLE MOVE;
将重新组织它并可能填补一些空白空间。缩小表格的物理尺寸可能会使阅读速度更快。CREATE TABLESPACE ... EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
答案 1 :(得分:2)
您可以使用并行提示来使用并行线程来更快地读取整个表。
SELECT /*+ parallel(t 4) */ * FROM Table1 t;
在空闲数据库上,您可以定义并行度,每个实例上的cpus / cores数量。