编辑:“some_table”(下面)原来是一个视图而不是一个表
好吧这看起来很离谱,但现在是:
SELECT COUNT(*) FROM some_table WHERE some_conditions;
结果是 715 。
SELECT col_a, col_b, col_c FROM some_table WHERE some_conditions;
结果是我在5分钟后中止了查询。
SELECT col_a, col_b, col_c FROM some_table WHERE some_conditions AND rownum <= 716;
结果是我在5分钟后中止了查询。
SELECT col_a, col_b, col_c FROM some_table WHERE some_conditions AND rownum <= 715;
结果是我在2秒内得到了我的数据。但是你可能会得到的结果是计数结果和rownum条件(即返回的715行)不是你得到的:你得到79行。
所以我有两个问题:
为什么Oracle会在“rownum&lt; = 716”查询中无限期地(无限期地意味着超过5分钟)磨掉,但在“rownum&lt; = 715”查询中返回得非常快?实际上,如果事实上在后一种情况下在2秒内返回所有可用结果,为什么WHERE子句中没有rownum条件的查询会无限期地继续下去?
为什么COUNT(*)会返回715,而我的“rownum&lt; = 715”查询只会产生79行?
免责声明:
我对问题中的表格的实际细节一直非常模糊......这是为了安全。如果一些额外的信息实际上会提高任何人分析情况的能力,请告诉我这些信息是什么,我希望我能提供。
我没有分析所涉及的查询计划,因为......我做不到。显然我缺乏必要的特权。我没有看到这种变化,我处于一个封闭的企业环境中。
我是Oracle新手,但不是RDBMS(我已经使用过SQL Server多年了)。我还在学习甲骨文,我的行为完全有可能充满了明显的愚蠢 - 如果是这种情况请告诉我,所以我知道,不要只是嘲笑我,导航到另一个问题!
对问题的跟进
@MJB:这实际上是一种观点。一个包含274列的视图:s我不知道视图是否已编入索引,是否有系统目录上的查询会告诉我(我在ALL_INDEXES上查询但没有返回结果)?
@MJB 2:我可以通过查询ALL_VIEWS.TEXT来获取源代码。我在Toad中使用了以下查询:
set LONG 10000 select TEXT from ALL_VIEWS where VIEW_NAME = :view and OWNER=:owner;
我的问题是,输出似乎有很多行,如:
TEXT (一行连字符出现在下一行;包括那里只是使单词TEXT粗体但是......)
分离输出。如果我摆脱所有这些并重新加入文本,我会有完整的定义,还是有可能我看到一些截断的版本?查询中的“设置LONG 10000”部分是我在Google上找到的内容,就我对它的理解而言,这可能是一个魔法咒语。
更新:一位同事向我展示了视图定义(它是一个星型模式连接成一个大的平面视图)并告诉我几乎没有索引。显然,开发是外包的......
在这种情况下,我不会惊讶于有惊人的性能悬崖,但我不确定为什么COUNT(*)会与我指定'WHERE rownum&lt; =时返回的行数冲突715'条款。是否有可能使用统计数据执行计数,而这些统计数据根本无法提供更好的结果?
考虑到基础表格的性质,我倾向于将这种情况写下来,因为糟糕的发展导致意外和令人讨厌的意外。正如其他人在评论中指出的那样,我实际上无法进行任何实验或修复。