我和我的同事已经成功地使用了Oracle未记录的/ * + MATERIALIZE * /提示将数据存储到全局临时表中,以使某些查询运行得更快,这是因为我们可以使用该提示一次提取数据因为某些数据在同一查询中被多次引用。
我们无法弄清楚为什么这并不总是有效。我无法使用伪造数据来产生相同的问题,但是当从较大查询中的多个表中提取数据时,在我们的OLTP生产数据库中工作时经常遇到此问题。
问题
我有一个利用几个CTE的查询,解释计划中的成本确实非常好。当我开始在后续CTE中使用数据时,就会出现问题。我在这些后续CTE中多次引用了其中一些数据,因此为加快查询速度,我添加了/ * + MATERIALIZE * /提示。再说一次,这通常是可行的,但是有时候它失败了,而我只是不知道为什么。
示例不使用提示
使用提示的示例
同样,此方法对于其他查询也非常有效。据我所知...一旦数据被具有/ * + MATERIALIZE * /的查询拉回,则表明数据已存储,然后可以使用它而无需对创建该数据集的表进行任何其他表访问。我在这里的问题是,一旦我尝试将数据存储在它自己的临时表中,Oracle就会基本上认为这是不可能完成的任务。