Oracle临时表:将大查询分解为多个步骤。

13 浏览
0 Comments

Oracle临时表:将大查询分解为多个步骤。

我在SQL Server领域工作了4年多后,目前已在Oracle世界工作了3周。现在我发现Oracle没有本地临时表,这让我感到困惑。

由于没有数据仓库用于报表,我经常需要从大量规范化的数据中组织报表。我很快就意识到把所有逻辑都塞进一个巨大的查询中(即一个有很多连接、子查询、相关子查询、并集等的查询)会导致性能糟糕。将过程正确地分解为较小的步骤,并利用索引临时表(可以在过程或临时脚本中动态创建和修改)通常会快得多。

然后就是Oracle...没有本地临时表。我显然甚至不能创建一个全局临时表,除非我被授予创建永久表的权限。我搜索了“oracle临时表权限”,第一个链接返回的是一个论坛问题,被接受的答案开头是“正如已经指出的那样,要想有一个能够创建全局临时表但不能创建永久表的用户,这是非常不寻常的。我很难想象有什么情况下这是有意义的。”这正是我在我们的生产环境中需要的。我的SQL Server思维已经被颠覆了。

我几乎可以接受只有全局临时表可供使用,但在Oracle中使用它们这种方式真的那么不寻常吗?如果没有临时表,我该如何实现类似的逐步逻辑呢?在临时脚本中,我如何保存并稍后重用类似于索引数据集的东西?显然,我需要的不是子查询或通用表表达式。

我一定是遗漏了什么...

0
0 Comments

-- 创建临时表
CREATE GLOBAL TEMPORARY TABLE temp_table (
  id NUMBER,
  name VARCHAR2(100)
) ON COMMIT PRESERVE ROWS;

在Oracle数据库中,有时候我们需要处理大型查询,但是由于查询涉及到的数据量较大,可能会导致查询性能下降或者数据库崩溃。为了解决这个问题,我们可以将大型查询拆分成多个步骤来执行。

然而,对于普通用户而言,并没有创建临时表的特权。但是我们可以通过一些解决方法来实现类似的功能。例如,我们可以通过撤销用户在永久表空间上的任何配额,这样用户就无法创建永久表。在Oracle 11g中,由于延迟段创建功能,用户可以创建表,但是无法插入任何行。然而,由于临时表使用临时表空间,所以不会遇到这个问题。

为了实现上述解决方法,我们可以通过以下步骤来创建临时表:

-- 创建临时表
CREATE GLOBAL TEMPORARY TABLE temp_table (
  id NUMBER,
  name VARCHAR2(100)
) ON COMMIT PRESERVE ROWS;

通过以上方法,我们可以模拟创建临时表的功能,将大型查询拆分成多个步骤来执行,从而提升查询性能和避免数据库崩溃的风险。

0