2

我正在编写一个使用带有非UNIQUE索引列的视图。但是,在我的观点范围内,我相信该列将仅包含唯一值(由于该WHERE子句中施加的条件)。

当有人基于该列(例如SELECT * FROM MY_VIEW WHERE COLUMN_WITH_NON_UNIQUE_INDEX = 'foo')查询视图时,就会出现真正的问题。优化器确信它将接收许多行(因为索引在技术上不是UNIQUE)。因此,优化器避免在视图中的其他位置使用其他索引以支持全表扫描(不酷)。

有没有办法让优化器相信具有非UNIQUE索引的列实际上将包含唯一值?当然,重复值可能会潜入列中,但这将被视为错误,不应导致合法的唯一数据受到影响。

不幸的是,我无法控制有问题的桌子(叹气)。

4

2 回答 2

2

Oracle 允许您在视图上创建唯一(和主键)约束,这些约束未强制执行,但可为优化器提供正是此类信息

ALTER VIEW your_view_name
  ADD CONSTRAINT name_of_constraint UNIQUE( column_with_non_unique_index )
  RELY DISABLE NOVALIDATE;

这将告诉 Oracle,它可以依赖于数据是唯一的这一事实,但它不需要验证约束。但是,优化器将能够使用约束提供的附加元数据。

于 2012-10-16T14:41:05.383 回答
1

您可以尝试以下方法:

使用 dbms_stats 收集表的统计信息,并将 METHOD_OPT 设置为 FOR ALL COLUMNS SIZE AUTO 使用此设置,Oracle 会自动确定哪些列需要直方图以及每个直方图的桶数(大小)。您还可以手动指定哪些列应该有直方图以及每个直方图的大小。

dbms_stats.gather_table_stats(
ownname => 'schemaname' ,
tabname => 'tablename' ,
estimate_percent => 100 ,
method_opt => 'for all indexed columns size auto' ,
 cascade => true);
于 2012-10-16T12:24:55.807 回答