将索引放在Oracle临时表上是否安全?

Evi*_*ach 12 oracle indexing temp-tables

我已经读过,不应该分析临时表,因为它会破坏其他人的表统计信息.索引怎么样?如果我在程序的持续时间内在表上放置一个索引,那么使用该表的其他程序是否会受到该索引的影响?

索引是否会影响我的进程以及使用该表的所有其他进程?或者它是否会影响我的过程?

没有一个回复是权威的,所以我提供贿赂.

Qua*_*noi 13

索引是否会影响我的进程以及使用该表的所有其他进程?或者它会影响我的过程吗?

我假设我们正在谈论GLOBAL TEMPORARY桌子.

可以将临时表视为多个表的临时表,这些表是由存储在系统字典中的模板动态创建和删除的.

Oracle,DMLtemporary table影响所有流程,同时包含在表中的数据将只影响使用它们的过程.

a中的数据temporary table仅在会话范围内可见.它用于TEMPORARY TABLESPACE存储数据和可能的索引.

DMLfor a temporary table(即其布局,包括列名和索引)对于具有足够权限的每个人都是可见的.

这意味着索引的存在将影响您的进程以及使用该表的其他进程,因为修改temporary table遗嘱中的数据的任何进程也必须修改索引.

相反,表中(以及索引中)中包含的数据将仅影响创建它们的进程,甚至对其他进程也不可见.

如果您希望一个进程使用索引而另一个进程不使用它,请执行以下操作:

  • temporary tables使用相同的列布局创建两个
  • 其中一个指数
  • 根据进程使用索引或非索引表


dpb*_*ley 9

我假设您指的是真正的Oracle临时表,而不仅仅是临时创建的常规表,然后丢弃.是的,在临时表上创建索引是安全的,它们将根据与常规表和索引相同的规则使用.

[编辑]我看到你提炼了你的问题,这是一个有点精炼的答案:

从:

Oracle® Database Administrator's Guide
10g Release 2 (10.2)
Part Number B14231-02
Run Code Online (Sandbox Code Playgroud)

"可以在临时表上创建索引.它们也是临时的,索引中的数据与基础表中的数据具有相同的会话或事务范围."

如果您需要索引在事务范围内进行有效处理,那么我想您将不得不在查询中明确地提示它,因为统计信息将不显示该表的行.

  • >Gary 不,索引的存储方式与表完全相同 - 在每个会话中单独存储,因此即使索引是唯一的,会话之间也不会发生冲突。显然,添加/删除索引需要锁定表,但是添加/删除索引的频率是多少?是的,统计信息全局适用于临时表,这就是为什么有时在查询 GTT 时需要使用 CARDINALITY 提示。 (3认同)
  • 意见无关紧要.结果很重要 - 测试一下,看看! (3认同)

Chi*_*Chi 6

你问的是两个不同的东西,索引和统计数据.对于索引,是的,您可以在临时表上创建索引,它们将按照惯例进行维护.

对于统计信息,我建议您明确设置表的统计信息以表示查询时表的平均大小.如果您只是让oracle自己收集统计信息,则统计信息进程不会在表中找到任何内容(因为根据定义,表中的数据是您的事务的本地数据),因此它将返回不准确的结果.

你可以这样做:

exec dbms_stats.set_table_stats(user, 'my_temp_table', numrows=>10, numblks=>4)

另一个提示是,如果临时表的大小变化很大,并且在事务中,您知道临时表中有多少行,您可以通过提供该信息来帮助优化器.如果你从临时表连接到常规表,我发现这有很大帮助.

例如,如果你知道临时表中有大约100行,你可以:

SELECT /*+ CARDINALITY(my_temp_table 100) */ * FROM my_temp_table